かずきのBlog@hatena

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

MVVMパターンでVMからVを操作する方法 再考

えムナウさんが考えてくれた方法は、確かに素敵だけど、コードを書く量が増えていってしまう。

ということで、超妥協案。ViewModelではActionやFuncあたりのデリゲートをプロパティとして公開して、ここにViewのメソッドをViewのコードからセットしてやる。
ViewModelは必要に応じて、このデリゲートの処理を呼んでやる。


XAMLで全部書いてやったぜ!!!っていう爽快感は無いけど、コード量は書いてもいいかなぁと思える量になります。

// View側のコード
this.DataContextChanged += (s, e) =>
{
    var model = e.NewValue as MainWindowViewModel;
    // modelのデリゲートにViewのメソッドを突っ込む
    model.ViewAction = this.Alert;
};
// ViewModelではデリゲートをプロパティとして公開する
public class MainWindowViewModel
{
    public Action ViewAction { get; set; }
}

とまぁ、ここまで書いてViewModelでイベントを公開するのと大差ないなぁと思った。悩ましい。
もっと簡単なのとエレガントなのを両立できる方法は無いかなぁ。