かずきのBlog@hatena

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

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でイベントを公開するのと大差ないなぁと思った。悩ましい。
もっと簡単なのとエレガントなのを両立できる方法は無いかなぁ。