> 바인딩 구현 #After XAML: /보기1:/ Text="{Binding ElementName=treeView, Path=SelectedItem.Header}" /> // 일반적 방법 /보기2:/ Text="{Binding SelectedItem.Header, ElementName=treeView }" /> // Binding 생성자를 통해 Path값을 넘겨 받는 방법 /보기3:/ Text="{Binding Source={StaticResource treeView}, Path=SelectedItem.Header }" /> // ResourceDictionary 참조.
[PropertyPath외에 RelativeSource Property를 사용하는 방법] -------------------------------------------------------------------------- 1> {Binding RelativeSource={RelativeSource Self}} : 소스/타겟 엘리먼트를 동일하게 만들어줌. 2> {Binding RelativeSource={RelativeSource TemplatedParent}} : 소스/타겟 엘리먼트의 TemplateParent를 동일하게 만들어줌. 3> {Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type desiredType}} : 소스 엘리먼트와 주어진 타입에 가장 근접한 부모엘리먼트와 동일하게 만들어줌. 4> {Binding RelativeSource={RelativeSource FindAncestor, AncestorLevel=n, AncestorType={x:Type desiredType}} : 소스 엘리먼트와 주어진 타입에 n 번째로 가까운 부모 엘리먼트와 동일하게 만들어줌. 5> {Binding RelativeSource={RelativeSource PreviousData}} : 소스 엘리먼트와 데이터 바인딩된 컬렉션의 이전 데이터와 동일하게 만들어줌.
> 의존 프로퍼티가 아닌 평범한 .Net 프로퍼티를 데이터 바인딩 소스로 사용하는 경우, 1. PropertyChanged 이번트를 정의하고, System.ComponentModel.INotifyPropertyChanged 인터페이스를 구현해야 하낟. 2. ooo_Changed 이벤트를 구현한다. ooo는 값이 변하는 프로퍼티 이름이다.
public class Book : Collection public class Book : ObservableCollection // 바인딩 동기화도 지원됨.
> 컬렉션 (Collection)에 바인딩 하기. - 일반적으로 컬렉션 ListBox.Items를 타겟 프로퍼티로 사용할수 있을것 같지만 Items는 의존 프로퍼티가 아니다. ItemsSource 라는 의존프로퍼티를 사용하여 데이터 바인딩을 해야 한다.
> 셀렉터 컨트롤들은 공통적으로 isSynchronizedWithCurrentItem 프로퍼티를 가지며, true 로 선언시 동일한 소스 컬렉션을 사용하고 있는 컨트롤 들을 동시에 변경해 준다.
-ex> ItemsSource="{Binding Source = { StaticResource photos}}" > ItemsSource="{Binding Source = { StaticResource photos}}" > // 둘중 하나에서 아이템이 선택되면 다른 하나도 자동으로 변경된다.
[Data Context를 이용한 소스공유] -------------------------------------------------------------------------- 컨트롤 마다 사용할 소스를 일일이 바인딩 하지 않고, 로지컬 트리의 상단에 DataContext="{StaticResource photos}" 처럼 정의 하면, 하위 컨트롤들은 Content="{Binding}" 과 같이 Binding된다는 암시적 정의로 소스를 사용할수 있다.
[렌더링 조절] -------------------------------------------------------------------------- 1. 데이터 Template 사용 - WFP 컨트롤은 데이터 템플릿을 효과적으로 사요하기 위해 DataTemplate Type의 프로퍼티들을 갖고 있다. ContentControl은 Content 객체의 렌더링을 조절하기 위해 ContentTemplate를, ItemControl은 ItemTemplate를 사용하여 개별 아이템에 적용한다. 이럴경우 비주얼 트리거가 새롭게 바뀐다.
// 각 Photo의 FullPath 프로퍼티를 사용하여 이미지를 출력해준다.
..Content..
2. Value 컨버터 사용 - DataTemplate가 타겟을 원하는 형태로 렌더링 해준다면, ValueConverter는 소스를 원하는 값으로 완벽하게 변경해준다.
// Count 프로퍼티를 사용하여 배경색(Brush)를 설정한다. (Count가 숫자형이기 때문에 Converter를 통해 변경한다.)
}
// 변경 되돌리기 Interface public object ConvertBack( object value, Type targeType, object parameter, CultureInfo culture ) { throw new NotSupportedException(); } }
3. 정렬 - ICollectionView 인터페이스의 SortDescriptions 프로퍼티를 사용하여 정렬한다.
ShortDescription sort = new SortDescription("Name", LitSortDirection.Ascending );
추가: IList.GetDefaultView() > ListCollectionView로 캐스팅 가능, IComparer 인터페이스를 통해 CustomSort 프로퍼티를 설정할수 있다.
4. 그룹핑 - ICollectionView 인터페이스는 SortDescriptions 보다 강력한 GroupDescriptions 프로퍼티가 있다. - 정렬과 다르게 그룹핑 결과는 ItemsControl에 데이터를 렌더링 하지 않으면 확인할수 없다. - 그룹핑을 지원하기 위해 GroupStyle을 추가해야 한다.
예제 XAML:
.. Content
5. 필터링/탐색
Filter a> delegate 사용. ICollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(this.FindResource("photos")); view.Filter = delegate(object o) { return ((o as Photo).DateTime - DateTime.Now).Days <= 7; }; // 7일 전 내용만 출력.
Filter b> Predicate 사용. ItemCollection items = mItemSetCollectin[idx]; CollectionView TreeCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(items); TreeCollectionView.Filter = new Predicate
[데이터 프로바이더] -------------------------------------------------------------------------- 소스 객체는 닷넷 객체이기에 적절한 코딩으로 데이터베이스, 레지스트리, 엑셀 시트등과 바인딩이 가능하며, WPF에서는 코딩을 최소로 하며 사용할수 있도록 2개의 클래스를 지원한다.
1. XmlDataProvider : xml 데이터를 소스로 사용.
// XML 데이터 1000
1500
800
// XML 데이터 바인딩 HighScore부분을 XPath를 사용해서 리스트박스 아이템으로 연결함.
2. ObjectDataProvider : .net 객체를 소스로 사용.
데이터 플로우 조절 : BindingMode.OneWay, TwoWay, OneWayToSource, OneTime TwoWay, OneWayToSource 일경우, 갱신지원을 위해 UpdateSourceTrigger 프로퍼티를 지원한다. 바인딩 검증 규칙 추가 : public class MyValidateionRule : ValidationRule {}... 흩어져 있는 소스 : CompositeCollection, MultiBinding, PriorityBinding 등 지원.