Попробовав много различных решений я продолжаю возвращаться к этому. Мне нужно Окно. ShowDialog, с помощью класса ViewModelLocator в качестве фабрики через UnityContainer.
В основном у меня есть Представление (и ViewModel), который на нажатии кнопки на представление должно создать диалоговое окно (взятие нескольких параметров в его конструкторе), который обработает некоторую логику и eventally возвратит результат вызывающей стороне (наряду с результатами всей логики, которую это вычислило).
Возможно, я неправ при том, что все еще посмотрел на это с точки зрения Windows Forms, но я знаю точно, что я хочу сделать, и я хочу идеально сделать это с помощью WPF и MVVM. Я пытаюсь сделать эту работу для проекта и в конечном счете не хочу должным быть возвращаться к ванильному WPF, чтобы заставить его работать.
Вы можете это сделать. Просто создайте экземпляр page / usercontrol / window и вызовите instance.ShowDialog ()
.
Вот мои шаблоны T4 для создания модели представления / представления с сообщениями о закрытии окна и другими трюками.
Я нарушил правила реализации диалогового окна, но попытался свести его к минимуму. У меня есть метод OpenDialog в моей модели BaseViewModel:
public void OpenDialog(DialogViewModel model)
{
this.MessengerInstance.Send<DialogViewModel, MainWindow>(model);
}
И в моем MainWindow:
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;
}
});
Вы также можете оставить получателя при отправке, чтобы класс представления не попал в модель представления, но в любом случае я думаю, что это приемлемое решение :)