내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2020-07-10 04:31

제목

[WPF] System.Windows.Data.Binding Class


1. Binding Class 소개
2. Rendering Control
3. CollectionView의 커스터마이징
4. Data Providor
5. Advence

 


[Binding]
--------------------------------------------------------------------------
System.Windows.Data.Binding Class사용

WPF에서의 "Data"의 의미
 - 데이터는 객체, XML 파일, 웹 서비스, 데이터베이스, 사용자의 객체, 버튼등의 WPF 엘리먼트를 모두 말한다.

Binding
 - 임의의 닷넷 객체를 함께 묶는것을 말하며, 반복적인 수동 code작업을 자동화 시키는데 효율적이다.


> 코드 구현 #Before

//TreeView:SelectedItem 변경 코드
void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e)
{
 curFoler.Text = (treeView.SelectedItem as TreeViewItem).Header.ToString();
 Refresh();
}

> 바인딩 구현 #After C#:
public MainWindow()
{
 Binding bind = new Binding();
 bind.Source = treeView;         // 소스 객체 설정.
 bind.Path = new PropertyPath("SelectedItem.Header"); // 소스 프로퍼티 설정.
 curFolder.SetBinding(TextBlock.TextProperty, bind);  // 타켓에 프로퍼티 바인딩 추가.
 
 // BindingOperations.SetBinding( curFolder, TextBlock.TextProperty, bind );
 // BindingOperations.ClearBinding( curFolder, TextBlock.TextProperty );
 // BindingOperations.ClearAllBindings( curFolder );  
}

> 바인딩 구현 #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 );

 정열 예제 C#:
 void sortByName_Click(object sender, RoutedEventArgs e)   { SortHelper("Name"); }
 void sortByDateTime_Click(object sender, RoutedEventArgs e)  { SortHelper("DateTime"); }
 void sortBySize_Click(object sender, RoutedEventArgs e)   { SortHelper("Size"); }

 void SortHelper( string propertyname )
 {
  ICollectionView view = CollectionViewSource.GetDefaultView(this.FindResource("photos"));
  
  if( view.SortDescriptions.Count > 0
   && view.SortDescriptions[0].PropertyName == propertyname
   && view.SortDescriptions[0].Direction  == ListSortDirection.Ascending ) // 오름차순 일 경우
  {
   // 내림차순으로 변경.
   view.SortDescriptions.Clear();
   view.SortDescriptions.Add(new SortDescription( propertyname, ListSortDirection.Descending ));
  }
  else
  {
   // 오름차순으로 변경.
   view.SortDescriptions.Clear();
   view.SortDescriptions.Add(new SortDescription( propertyname, ListSortDirection.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(Filter_Method); // Filter_Method 참인것만 출력.
 
 > 바인딩에서 사용되는 프로퍼티 경로들은 '/' 문자로 현재 아이템을 참조 할수 있다.
 1. "{Binding Path=/}"    : 데이터 소스가 컬렉션일 경우 현재 아이템과 연결.
 2. "{Binding Path=/DateTime}"  : 현재 아이템의 DateTime 프로퍼티와 연결.
 3. "{Binding Path=Photos/}"   : 다른데이터 소스에 있느 Photos프로퍼티를 통해 접근할수 있는 컬렉션의 현재 아이템과 연결.
 4. "{Binding Path=Photos/DateTime}" : Photos를 통해 접근할수 있는 컬렉션의 DateTime 프로퍼티와 연결.

 


[데이터 프로바이더]
--------------------------------------------------------------------------
소스 객체는 닷넷 객체이기에 적절한 코딩으로 데이터베이스, 레지스트리, 엑셀 시트등과 바인딩이 가능하며,
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 등 지원.

 


[XAML로 RSS 리더 만들기]
--------------------------------------------------------------------------
        xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="
http://schemas.microsoft.com/winfx/2006/xaml"
        Title="RSS Reader" Height="563" Width="868">
   
        http://blogs.msdn.com/adam_nathan/rss.aspx" />
   

   
   
       
       


출처1

http://imakeworld.egloos.com/10979603

출처2