読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

WPFのデータバインディング学習メモ

WPF4 unleashedより、学んだことをメモ。

コードでバインドするパターン

//FtreeはTreeViewで、CurrentFolderはTextBlock

 Binding b = new Binding();
 b.Source = Ftree;
 b.Path = new PropertyPath("SelectedItem.Header");
 CurrentFolder.SetBinding(TextBlock.TextProperty, b);

このようにバインドソースを指定から、バインドソースのどのプロパティと紐付けるかを選ぶ。で、バインド先はバインドしたいターゲットのプロパティとバインドしたいオブジェクトを紐付けする。一番シンプルなデータバインドのコード。

XAMLでバインドするパターン

 <TextBlock 
   x:Name="CurrentFolder" Background="AliceBlue" FontSize="16" 
   Text="{Binding ElementName=Ftree,Path=SelectedItem.Header}"/>

XAMLでバインドすると補完も効いてくれる。Pathプロパティには、FtreeというTreeViewのどのプロパティをバインドするかの一覧が出てくれる。コードビハインドが当たり前だったらWindowsフォームに比べるとすげー楽。XAMLが好きになってきたw

なので、コードビハインドでバインドするコードは書く理由がない。

通常のプロパティ

依存プロパティではない場合はちょっと違ってくる。依存プロパティってのは親のプロパティと同じ宣言をしていてそれに依存性があるもの。CSSで言うとBodyで宣言したfont-sizeはp要素でも引き継がれる。あるプロパティが他のプロパティにセットされた値に依存することから、通常のクラスのプロパティと違うという意味で、そういう区分けをしている。

 <TextBlock 
   x:Name="CurrentFolder" Background="AliceBlue" FontSize="16" 
   Text="{Binding Source={StaticResource photos,Path=Count}"/>

ElementNameでの指定は出来ない。 System.Windows.FrameworkElementのオブジェクトではないからね。乱暴に言えばUIElementじゃないクラスのプロパティはElementNameではバインドできないので、Sourceプロパティでバインド元を指定する。

変更通知の仕組みを実装する

UIElementの依存プロパティは変更の通知やバインドの仕組みをサポートしているけれども、通常のクラスにはそんなもんがないので、バインドソースとして利用したいなら下記2つを実装しないとダメ。バインドソースのプロパティはリフレクションを元に取得するんだって。

  1. System.ComponentModel.INotifyPropetyChangedインターフェイスの実装
  2. プロパティ名+ChangedEventの実装

コレクションでバインドしたいのなら、この2つの機能を持っているクラス(System.Collections.ObjectModel.ObservableCollection) を継承するといい。

とりまここまで。