Я нарушаю правила для реализации диалогового окна, но стараюсь свести его к минимуму. У меня есть метод OpenDialog в моей BaseViewModel:
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();
});
Таким образом, у меня только слабая связь между моей viewmodel и моим 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;
}
});
Вы также можете оставить получателя при отправке, чтобы исключить класс представления из модели представления, но в любом случае я думаю, что это приемлемое решение :)