簡単なバインディングはできても少し複雑になるとすぐ上手くいかなくなってしまう。
自分はデータ・バインディングのことを何も知らないまま突き進もうとしている…。
そこで、データ・バインディングとは何者なのか、見つめ直してみることにします。
本記事では、詳細を見る前に、データ・バインディングの大まかな概要だけをまとめることにします。
1. データ・バインディングとは
- データ・バインディングとは、何らかのデータを別の箇所に反映させる仕組みのこと。
- バインディングするときには、反映元である「ソース」と反映先である「ターゲット」の二者が存在する。
- .NETやXAMLに限った用語ではない。
- MVVMパターンの実現に必要不可欠な仕組み。
2. バインディングのソースとターゲットとは
「どれがソースで、どれがターゲット?」を常に意識することによって、バインディングへの理解が深まり自信をもって実装できるようになっていくと思う。
バインディング・ソース
反映元のデータを格納するプロパティを保持するオブジェクトのこと。
■ ソースになれるもの
- CLRオブジェクトのpublicプロパティ
- 依存関係オブジェクトの依存関係プロパティ
- XMLオブジェクト(割愛)
- 動的オブジェクト(割愛)
バインディング・ターゲット
データの反映先となるプロパティを保持するオブジェクトのこと。
■ ターゲットになれるもの
- 依存関係オブジェクトの依存関係プロパティ
補足1:「CLRオブジェクトのプロパティ」とは
CLRとは「[共通言語ランタイム](CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。)」の略ですが、XAMLの話をするときは、.csファイルに書いたC#コードのことを、XAMLと区別して指すときに使われがちな言葉のように思います。よって一例は、普通のC#クラスに書いた普通のプロパティです。
MVVMパターンに則した開発なら、バインディング・ソースとしてViewModelクラスのプロパティを使う方法が最頻出だと思います。
public string MyText {get; set;}
((余談…開発の便宜上、XAMLとCLRは対義語のように語られたりしますが、WPFではXAMLはC#で書くと分かりにくいコードを分かりやすく書くために使われていて、C#などの.NETプログラミング言語に対応付けがされているので、C#などと同様に最終的にはCLRオブジェクトを生成する。つまりXAMLとCLRは実際には対立する存在ではない。))
補足2:「依存関係オブジェクト」とは
Window や、そこに配置する Button、TextBox など部品のクラスは、DependencyObject というクラスを継承しています。このようなクラスから生成されるオブジェクトを依存関係オブジェクトと言います。DependencyObjectクラスを継承することで、「依存関係プロパティ」という特別なプロパティを定義できるようになります。補足3:「依存関係プロパティ」とは
とてもおおざっぱに言うと、XAMLで書ける要素に好きな値を指定できるプロパティのことです。 例えば、「Hello.」と書かれたテキストボックスを作りたいとき、XAMLでTextBox要素のTextプロパティに「Hello.」という文字列を指定しますよね。このTextプロパティが、TextBoxが持つ依存関係プロパティの1つです。<TextBox Text="Hello."/>
3. Bindingマークアップ拡張とは
参考1:izumi様の記事(Qiita)
参考2:.NETな日々 -EX-
-
XAMLマークアップ拡張
XAMLで{}
(波括弧)で囲んで書く記述のこと。 -
Bindingマークアップ拡張
XAMLマークアップ拡張のうち、データ・バインディングに関する記述のこと。
マークアップ拡張は、データ・バインディングでは日常的に使うので避けて通れない道です。
入門者の我々が「バインディングがうまくいかない!」という時は、ViewModel側で通知を忘れているか、そうでなければBindingマークアップ拡張を理解できていないために正しくバインディングができていないからです。
Bindingマークアップ拡張では、単純にバインディング・ソースを指定するだけの記述から、バインディングの細かい挙動設定まで様々に指定できるようになっています。
<TextBox Text="{Binding MyText}"/>
<TextBox Text="{Binding Path=MyText, Mode=TwoWay}"/>
実はこれはBindingというクラスのオブジェクトを生成して、PathやらModeやらとかいうプロパティに値を設定しているだけなのです。
というわけで、バインディングのもうちょっと詳細な裏側は次回以降の記事に書きたいと思って、、おるよ(^ω^)