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を知らない設計を目指す
