对话(真实的)

时间:2010-04-28 00:10:36

标签: mvvm-light

尝试了许多不同的解决方案后,我不断回过头来。我需要一个Window.ShowDialog,使用ViewModelLocator类作为工厂通过UnityContainer。

基本上我有一个View(和ViewModel),按下按钮就需要在视图上创建一个对话框(在其构造函数中加入一些参数),它将处理一些逻辑并最终将结果返回给调用者(以及它计算出的所有逻辑的结果。

也许我从Windows窗体的角度来看这个问题是错的,但我确切地知道我想要做什么,而且我希望理想情况下使用WPF和MVVM。我正在尝试为项目做这项工作,并且最终不想回到vanilla WPF以使其工作。

2 个答案:

答案 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,其中包含关闭窗口和其他技巧的消息。