最終更新:2020-04-07 (火) 18:26:52 (1479d)
WPF/データバインディング
http://msdn.microsoft.com/ja-jp/library/ms752347(v=vs.80).aspx
ビューとモデルを分離するための仕組み
使い方
プロパティ項目の指定 (Binding)
<TextBlock Text="{Binding Hoge}" />
- と書くと、そのUI要素のDataContextプロパティに格納されているオブジェクトのHogeプロパティを参照することになる。
- 同名のプロパティさえ持っていればよく、具体的な型が何かは問われない
データ取得元オブジェクトの指定 (DataContext)
- データソースははDataContextプロパティで指定する。
- 値の結び付けはリフレクションを用いて行われており、DataContextには任意の型を渡すことができる
- DataContextプロパティは親UI要素から値が引き継がれる
Binding構文
普通の書き方
<TextBox ...> <TextBox.Text> <Binding Path="HogeProperty" /> </TextBox.Text> </TextBox>
短いバインディング構文
<TextBox TextContent="{Binding Path=HogePropery}" />
最も短いバインディング構文
<TextBox TextContent="{Binding HogePropery}" />
モード (Binding.Mode)
BindingMode.Default 既定値は、各依存関係プロパティによって異なります。 一般に、ユーザーが編集できる、テキスト ボックスやチェック ボックスなどのコントロール プロパティは既定で双方向のバインディングであり、それ以外のほとんどのプロパティは既定で一方向のバインドになります BindingMode.OneTime? UI要素生成時に一度だけ、ソース・プロパティの値を読み出してターゲット・プロパティに与える。 BindingMode.OneWay? ソース・プロパティが変更された際に、ターゲット・プロパティに変更を反映させる(逆は行わない)。 BindingMode.OneWayToSource? ターゲット・プロパティが変更された際に、ソース・プロパティに変更を反映させる。 BindingMode.TwoWay? ソース・プロパティおよびターゲット・プロパティのいずれの変更も、他方に反映させる。
プロパティsetのタイミング (UpdateSourceTrigger?プロパティ)
- Default: バインディング・ターゲットの依存関係プロパティのメタデータに基づいてタイミングを決定する(何も指定しない場合、これが設定される)。
- PropertyChanged?: バインディング・ターゲットの値が変化するたびに(例えば、テキストボックスの場合、1文字入力されるたびに)変更を通知する。
- LostFocus?: バインディング・ターゲットの要素がフォーカスを失うたびに(例えば、テキストボックスからフォーカスを外した際に)変更を通知する。
- Explicit: 明示的にUpdateSourceメソッドを呼び出した場合にのみ変更を通知する。
コレクションのバインディング
- IEnumerableを実装するコレクション
- ObservableCollection
メモ
- 特に理由がなければ、WPFでコレクションのデータバインディングを行う場合はObservableCollectionを使います
関連
- データテンプレート (DataTemplate?)
- 依存関係プロパティ
- StaticResource
- INotifyPropertyChanged