如何使用mediator模式在MVVM中打开/显示一个新窗口?

时间:2011-03-05 00:52:21

标签: mvvm window modal-dialog viewmodel

我非常喜欢WPF& MVVM范例,我正在努力吸收它。我遇到的问题看起来像很多MVVM的初学者都面临同样的问题。似乎没有简单的方法。因此,为了使问题域保持简单,这只是一项实验性工作。

我有一个MainWindow,上面有一个“新建”按钮。我想在单击此按钮时显示NewWindow.xaml的实例。我怎么能从MainWindowViewModel做到这一点?调解员模式有帮助吗?请提出任何良好的实施参考。

我在MainWindow&上也有一个“关闭”按钮。我想点击这个时退出应用程序。我再次需要帮助:(

2 个答案:

答案 0 :(得分:2)

我之前确实遇到过同样的问题。

至少我使用一种非常简单的方法,我很满意。 here是我的解决方案。

在您的viewmodel中,您只需编写一行代码:

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", newdialogwindowVMgoeshere);
//do what you want with the dialogresult

答案 1 :(得分:1)

我将对话框代码放入View的CodeBehind中。我仍然通过ViewModel路由命令,但ViewModel调用View的实现并获得结果。

假设我有MainWindow View(xaml)和MainWindow ViewModel,我想保存文件。

在codebehind View(MainWindow.xaml.cs)中,我添加代码来创建对话框并返回保存文件名:

    public FileInfo OpenSaveFileDialog(string title, string filter)
    {
        var dialog = new SaveFileDialog
        {
            Filter = filter,
            Title = title
        };

        var result = dialog.ShowDialog();
        if (!result.Value) return null;

        return new FileInfo(dialog.FileName);
    }

在ViewModel中我有一个DoSaveFile()方法:

    public void DoSaveFile()
    {
        var file = OpenSaveFileDialog("Save File", "Super files (*.super)|*.super |All files (*.*)|*.*");
        if (file == null) return;
        //Save logic...
     }

    public DelegateCommand SaveFile { get { return Get("SaveFile", new DelegateCommand(DoSaveFile, () => true)); } }

在MainWindow.xaml中,我有一个绑定到委托命令的按钮:

    <Button Content="Save File" Command="{Binding SaveFile}"/>

与MVP一样,这种实现很健谈,但它对于关注点的测试和分离非常有效。对我来说,将窗口开放的机制留给View类是有意义的,甚至认为它有点像活动视图。