5.2 UI を作成する
5.3.3 添付ビヘイビアの作成
50 51 52
} } }
15 行目で定義した Callback 添付プロパティに対するメタ情報に OnCallbackPropertyChanged イベントハンドラを 追加しています。これは、Callback 添付プロパティの値が変更されたときに呼ばれるメソッドを指定しています。このメ ソッドは 43 行目で定義しています。このメソッドの中で、イベント発行元から GetCallback() メソッドによって
Callback 添付プロパティを取得しています。イベント発行元とは、Callback 添付プロパティが変更されたコントロール
となります。そして、取得した Callback 添付プロパティが null でなければ実行するようにしています。
ワンポイント 5.1:イベントハンドラも自動生成機能で作成できる
ワンポイント 4.1 でも紹介したように、Visual Studio には未定義のメソッドやプロパティを自動生成する機能があり ます。イベントハンドラも例外なく自動生成できるので、例えば添付プロパティの変更イベントハンドラもこの機能で生成 しましょう。コード 5.11 の 43 行目に Callback 添付プロパティの変更イベントハンドラを定義していますが、このメソ ッ ド を 自 分 で 入 力 す る 前 に 、15 行 目 の PropertyMetadata ク ラ ス の コ ン ス ト ラ ク タ の 入 力 引 数 に 対 し て
"OnCallbackPropertyChanged" と入力しましょう。すると、ワンポイント 4.1 のようにメニューが表示され、これを選 択すると 43 行目のようなメソッドが自動的に生成されます。
自動生成機能を使うことで、そのイベントハンドラがどのような入力引数だったのかを覚えていなくても簡単にイベント ハンドラを作ることができるので、積極的に利用しましょう。
続いて、MainViewModel クラスで DialogCallback プロパティが変更されるように修正します。
コード 5.12:DialogCallback プロパティが変更されるように修正 MainViewModel.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
namespace YKWpfIntroduction.Practices.ViewModels {
using System;
/// <summary>
/// MainView ウィンドウに対するデータコンテキストを表します。
/// </summary>
internal class MainViewModel : NotificationObject {
private DelegateCommand _openFileCommand;
/// <summary>
/// ファイルを開くコマンドを取得します。
/// </summary>
public DelegateCommand OpenFileCommand {
get {
return this._openFileCommand ?? (this._openFileCommand = new DelegateCommand(
_ =>
{
this.DialogCallback = OnDialogCallback;
}));
} }
private Action<bool, string> _dialogCallback;
/// <summary>
/// ダイアログに対するコールバックを取得します。
/// </summary>
public Action<bool, string> DialogCallback {
get { return this._dialogCallback; }
private set { SetProperty(ref this._dialogCallback, value); } }
/// <summary>
37 38 39 40 41 42 43 44 45 46 47
/// ダイアログに対するコールバック処理をおこないます。
/// </summary>
/// <param name="isOk">ダイアログの結果を指定します。</param>
/// <param name="filePath">ファイルのフルパスを指定します。</param>
private void OnDialogCallback(bool isOk, string filePath) {
this.DialogCallback = null;
System.Diagnostics.Debug.WriteLine("コールバック処理をおこないます。");
} } }
21 行目で DialogCallback プロパティを変更しています。ここの処理は「開く」メニューを選択したときに実行されま
す。また、指定した OnDialogCallback() メソッドでは DialogCallback プロパティに null を指定しています。コー ルバック処理されたときに DialogCallback プロパティを null に戻すようにしています。
それではアプリケーションを実行してみましょう。図 5.10 のように、「開く」メニューを選択すると出力ウィンドウに メッセージが表示されるようになりました。
(a) 「開く」メニューを選択する (b) メッセージが表示される
図 5.10:添付ビヘイビアによるコールバック処理の確認
動作について箇条書きで整理します。
1. 「開く」メニューが選択されると MainViewModel クラスの OpenFileCommand プロパティが実行される
2. MainViewModel クラスの OpenFileCommand プロパティが実行され、DialogCallback プロパティが変更される 3. MainViewModel クラスの DialogCallback プロパティと CommonDialogBehavior クラスの Callback 添付プロパ
ティがデータバインディングによって紐付けられているため、CommonDialogBehavior クラスの Callback 添付プロ パティが変更される
4. CommonDialogBehavior クラスの OnCallbackPropertyChanged イベントハンドラが処理される 5. OnCallbackPropertyChanged イベントハンドラで指定されたコールバックメソッドが呼び出される
6. MainViewModel クラスの OnDialogCallback() メソッドが処理され、DialogCallback プロパティが null に変更 されるので、CommonDialogBehavior クラスの OnCallbackPropertyChanged イベントハンドラが処理されるが、
Callback 添付プロパティは null に変更されているため、特に何も処理されずに OnCallbackPropertyChanged が 終了する
7. 引き続き MainViewModel クラスの OnDialogCallback() メソッドの処理が継続して終了する