WPF(MVVM)でViewModelからViewをnewしたらいけないんだってさ

WPF

DB,ロジック,画面で記述がめちゃくちゃにならないように
MVVMはModel・View・ViewModelに分かれているワケなんだけど、
依存関係が一方向になるように設計する考え方なんだってサ

実際、ViewModelからなんでもできてしまうから
どういう風にいけないことなのかなんてわからないよね。

ダメな例(ViewModelからViewをnewするコード)

ViewModelから新しい画面を表示したいときに
Viewクラスをnewして画面表示のメソッドを呼び出している

public void OpenDialog()
{
    FilesCopyView view = new();
    view.ShowDialog();
}

ViewModelからViewをnewしてはいけない理由

もしViewModel内でViewを生成しちゃうと、
Viewでの変更に伴ってViewModelまで修正しないといけないことが増えちゃうっぽい

MVVMのいいところである
「変更に強い設計」「メンテしやすい設計」ってところが薄れちゃう

正しい方法の例(CommunityToolkit.Mvvmを使う場合)

Messengerを使ってViewに「画面を開いてほしい」というメッセージを送信して、
メッセージを受信したView側で画面を表示する流れにする

ViewModel

// 送信する記述
WeakReferenceMessenger.Default.Send(
    new OpenFilesCopyDialogMessage());

Viewの.cs

// 受信する記述
WeakReferenceMessenger.Default.Register<OpenFilesCopyDialogMessage>(
    this, (r, msg) => {
        FilesCopyView view = new();
        view.ShowDialog();
    });

メッセージについての解説記事はまた別で書きます

まとめ

  • ViewModelからViewをnewしない
  • ViewModelはMessengerで通知するだけ
  • 実際に画面を表示するのはView側の役割
  • MVVMではViewModelがUIを知らない設計を目指す
タイトルとURLをコピーしました