如何使用中介者模式在MVVM中打开/显示新窗口?

4

我在WPF和MVVM范式方面非常新,并且正在努力吸收它。我遇到的问题看起来像很多MVVM初学者面临的问题一样,似乎没有简单的方法。因此,为了使问题域简单,这里只是一个实验性工作。

我有一个MainWindow,上面有一个“New”按钮。当我点击此按钮时,我想显示一个NewWindow.xaml的实例。如何从MainWindowViewModel中实现这一点?中介模式可以帮助吗?请提供任何好的实现参考。

我还在MainWindow上有一个“Close”按钮,当我点击它时,我想退出应用程序。我再次需要帮助 :(

2个回答

2

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

至少我采用了一种非常简单的方法,并且很满意。这里是我的解决方案。

在您的视图模型中,您只需要编写一行代码:

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

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类是有道理的,即使它感觉有点像主动视图。


1
ViewModel如何引用视图以调用View实例中的公共成员(OpenSaveFileDialog)? - Ralph Shillington
我认为ViewModel会在构造函数中获取类似IView接口的东西作为参数。当然,View要实现IView并将其传递给ViewModel作为IView。 - blindmeis
我也在寻找一种好的模式来从ViewModel中显示另一个窗口。但我认为你的解决方案不太好。ViewModel不应该知道任何关于View的信息。如果ViewModel公开一个事件,View处理它以显示新窗口会更好。 - Ha Pham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接