MVVM パターンの要となるデータバインディング機能を実現するためには、
INotifyPropertyChanged インターフェースおよび ICommand インターフェースの実装が欠かせません。
しかし、いつも自前で実装するのは手間がかかるため、
YKToolkit.Controls.dll ではこれらのインターフェースの実装を済ませてあるクラスを
YKToolkit.Bindings 名前空間で公開しています。
ページ内リンク
NotificationObject クラス
INotifyPropertyChanged インターフェースを実装している NotificationObject クラスは
次のように定義しています。
NotificationObject クラスは抽象クラスなので、必ず継承して使うようにします。
NotificationObject クラスの SetProperty() メソッドは、プロパティ変更のためのヘルパです。
プロパティの set アクセサでは、値の代入と RaisePropertyChanged() メソッドのコールをしなければなりません。
こういった決まったコードは、プロパティの数が増えれば増えるほど省略したくなります。
そんなとき、SetProperty() メソッドを使用することで値の代入とメソッドのコールを 1 行で書くことができます。
具体的には次のように使用します。
SetProperty() メソッドにプロパティの実体を ref 修飾子を付けて渡すことで、
内側でプロパティ値の更新をおこないます。
また、RaisePropertyChanged() メソッドを内側でコールしていますが、
プロパティ名を省略することで、すべてのプロパティについて変更通知をおこなうため、
上記のようにかなり簡略化することができます。
また、SetProperty() メソッドは、プロパティ値に変更があったとき true を返します。
これを利用することで、上記のように他のプロパティ変更通知を同時におこなうことができます。
DelegateCommand クラス
ICommand インターフェースを実装している DelegateCommand クラスは 次のように定義しています。
使うときはコンストラクタでコマンドの実行処理を指定します。
実行可能判別処理は省略することができます。省略した場合はいつでもコマンド実行可能となります。
使用例を次に示します。
このように、DelegateCommand クラスはコンストラクタで一般的にラムダ式を使います。
上記の例では、コンストラクタの第 1 引数に counter をインクリメントするコマンドを指定し、
第 2 引数に counter が 10 未満であれば true を返す実行可能判別処理を指定しています。
したがって、上記のコードは、初期状態から 10 回連続で ButtonCommand が実行可能で、
それ以降は counter が 10 未満にならない限り実行できなくなるということになります。
YKToolkit.Controls.dll を導入したサンプルプログラムを公開しています。こちらを参考にして下さい。