かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

MVVMパターンでVMのメソッド実行前後に処理をしたいことってあるよね? その2

前にも同じような話題で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