尝试了许多不同的解决方案后,我不断回过头来。我需要一个Window.ShowDialog,使用ViewModelLocator类作为工厂通过UnityContainer。
基本上我有一个View(和ViewModel),按下按钮就需要在视图上创建一个对话框(在其构造函数中加入一些参数),它将处理一些逻辑并最终将结果返回给调用者(以及它计算出的所有逻辑的结果。
也许我从Windows窗体的角度来看这个问题是错的,但我确切地知道我想要做什么,而且我希望理想情况下使用WPF和MVVM。我正在尝试为项目做这项工作,并且最终不想回到vanilla WPF以使其工作。
答案 0 :(得分:2)
我违反了实施对话窗口的规则,但试图将其减少到最低限度。我的BaseViewModel中有一个方法OpenDialog:
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();
});
这样我的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;
}
});
您也可以在发送时离开接收器,以保持视图类不在视图模型中,但无论哪种方式,我认为这是一个可接受的解决方案:)
答案 1 :(得分:0)
你可以做到这一点。只需创建一个页面/用户控制/窗口的实例,然后调用instance.ShowDialog()
。
Here's my T4 templates生成一个view / viewmodel,其中包含关闭窗口和其他技巧的消息。