かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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