添付ビヘイビアとは、既存のコントロールに後付けで新たに添付することができ、
特定のイベントに対する振る舞いを定義することができるものです。
サンプルプロジェクトはここからダウンロードできます。
ページ内リンク
概要
ここでは、ファイルを開くためのボタンを作ることを考えます。
ファイルを開く方法はいろいろありますが、
ここではコモンダイアログを使用してファイルを開くことを考えます。
コモンダイアログを使うためには次のようなコードが必要になります。
ところで、このようなコードは一体どのに書くべきなのでしょうか。
ShowDialog() メソッドでコモンダイアログを開いているため、
MVVM パターンに則って考えると、View の範疇となります。
しかし、その後の処理は View の範疇を超えるため、
得られたファイルのフルパスは ViewModel 側に通知して、
その後の処理は ViewModel もしくは Model にまで掘り下げる必要があるかもしれません。
このような場合、添付ビヘイビアを用いることで非常にスマートに記述できます。
それでは次に添付ビヘイビアの作成方法についてみていきます。
作成方法
添付ビヘイビアを作成するには、まず添付プロパティを持つクラスを作成します。
ここでは ReadFileBehavior という名前のクラスに IsAttached 添付プロパティを作成します。
ここで、添付プロパティの定義中の FrameworkPropertyMetadata に対する第 2 引数に着目します。
FrameworkPropertyMetadata のコンストラクタはいくつかオーバーライドがありますが、
ここでは OnIsAttachedChanged という静的メソッドへのデリゲートを指定しています。
このようにデリゲートを指定することで、そのプロパティが変更されたときのイベントハンドラを登録することができます。
ここでは IsAttached 添付プロパティの既定値が false となっているため、
true となったときに OnIsAttached イベントハンドラが呼び出されることになります。
もちろんその後 IsAttached 添付プロパティがもう一度 false になったらまた OnIsAttached イベントハンドラが呼ばれます。
このイベントハンドラに対して次のようなコードを記述します。
この添付プロパティが Button コントロールに対して設定された場合、
IsAttached 添付プロパティが true なら Click イベントに対して何か処理をおこない、
false なら処理をおこなっていたイベントハンドラの登録を解除しています。
このようなコードを記述することで、
Button コントロールの Click イベントに対する振る舞いを
ここで定義することができるようになります。
これが添付ビヘイビアです。
ここではファイルを読み込むためのボタンを作りたいので、Code 1 に示したコードをこの Click イベントハンドラに記述します。
上記のコードでコモンダイアログによってファイルのフルパスを取得するところまでできましたが、
そのフルパスは出力ウィンドウに表示されるだけで、ViewModel に伝える手段がありません。
そこで、次のような添付プロパティを追加します。
Callback 添付プロパティは Action<string> という型で、string 型を引数に持つ void 型のメソッドへのデリゲートです。
このデリゲートを使って取得したファイルのフルパスを ViewModel に伝えようというわけです。
この Callback 添付プロパティを追加した Click イベントハンドラのコードは次のようになります。
使用方法
上記で作成した添付ビヘイビアを実際に Button コントロールに追加してみましょう。
ReadFileBehavior クラスが属する名前空間のエイリアスを定義して、
IsAttached 添付プロパティを Button コントロールに添付しています。
また、Callback 添付プロパティには ViewModel の ReadFileCallback プロパティをデータバインドしています。
実行すると、
Button コントロールを押すとコモンダイアログが表示され、
適当なファイルを選択すると、
出力ウィンドウに "ViewModel : (ファイルのフルパス)" が表示されます。
このように添付ビヘイビアは任意のコントロールに対して後から外付けでその振る舞いを追加できるため、
再利用性が高いというメリットがあります。