ダイアログウィンドウを実装するためのルールを破りましたが、最小限に抑えようとしました。BaseViewModelにメソッドOpenDialogがあります。
public void OpenDialog(DialogViewModel model)
{
this.MessengerInstance.Send<DialogViewModel, MainWindow>(model);
}
そして私のメインウィンドウで:
Messenger.Default.Register<DialogViewModel>(this, model =>
{
// Instantiate the dialog box
var dlg = new DialogWindow();
// Configure the dialog box
dlg.Owner = this;
dlg.Content = model;
// Open the dialog box modally
dlg.ShowDialog();
});
そうすれば、ビューモデルとMainViewの間の結合が緩くなるだけです。閉じる場合も同じことができます。私のBaseDialogViewModelには次のメソッドがあります。
public void CloseDialog()
{
this.MessengerInstance.Send<PopUpAction, DialogWindow>(PopUpAction.Close);
}
(PopupActionは単なる列挙型です)そして私のDialogWindowはそのために登録します:
Messenger.Default.Register<PopUpAction>(this, action =>
{
switch (action)
{
case PopUpAction.Close:
this.Close();
break;
}
});
ビュークラスをビューモデルから除外するために、送信時にレシーバーを離れたままにすることもできますが、どちらの方法でも、許容できる解決策だと思います:)