前にも同じような話題でBlogを書いた記憶があるので、その2にしてます。先日紹介したBehaviorを使うと、簡単にこのようなことが出来ます。例えば、ありがちなパターンとして、メソッド実行前に確認ダイアログを出したい!!という場合には以下のようなBehaviorを作ればOKです。
VMのメソッド呼び出しの機能はExpression Blendに最初からついてるCallMethodActionビヘイビアで提供されているので、こいつを改造してやります。確認メッセージを出すだけの拡張なので結構簡単に実装できます。
namespace WpfBehavior { using System.Windows; using Microsoft.Expression.Interactivity.Core; public class ConfirmCallMethodAction : CallMethodAction { #region 確認メッセージプロパティ public string ConfirmMessage { get { return (string)GetValue(ConfirmMessageProperty); } set { SetValue(ConfirmMessageProperty, value); } } public static readonly DependencyProperty ConfirmMessageProperty = DependencyProperty.Register("ConfirmMessage", typeof(string), typeof(ConfirmCallMethodAction), new UIPropertyMetadata(null)); #endregion public ConfirmCallMethodAction() { } protected override void Invoke(object o) { if (IsCallMethod()) { // メソッドを呼び出すときだけ基本クラスのInvokeを呼ぶ base.Invoke(o); } } private bool IsCallMethod() { if (string.IsNullOrWhiteSpace(this.ConfirmMessage)) { // 何も確認メッセージが設定されていない場合はOK return true; } // 確認ダイアログでOKが押されたらOK return MessageBox.Show(this.ConfirmMessage, "確認", MessageBoxButton.OKCancel) == MessageBoxResult.OK; } } }
このビヘイビアをCallMethodActionの代わりに使ってConfirmMessageプロパティを設定すると、ViewModelの処理の実行前に確認ダイアログが出てくれます。このビヘイビアを適用してみたプログラムの実行結果は以下のようになります。
上記のプログラムのコードは、下のリンクからダウンロードできます。
http://cid-c0989b857f2f850c.office.live.com/self.aspx/%e5%85%ac%e9%96%8b/samples/WpfBehavior.zip