如何使用MVVM模式处理打开和关闭新窗口?

9

使用MVVM和WPF,处理打开和关闭新窗口和对话框的好方法是什么? 打开和关闭应由ViewModel驱动,但ViewModel不应该知道视图...


我在这篇帖子中回答了一个非常类似的问题。 - Mike Fuchs
1个回答

6

我通常使用接口来实现这个功能。例如,如果我想在一个单独的窗口中编辑记录,我会有一个名为IEditingProvider<TViewModel>的接口,我可以在其他地方实现它,然后将一个接口引用传递给我的ViewModel的构造函数。EditingProvider可能只是做这样的事情:

class MyRecordEditingProvider: IEditingProvider<MyRecordViewModel>
{
    // Implementation of generic interface method
    public void Edit(MyRecordViewModel model) {
        EditWindow edit = new EditWindow(); 
        edit.DataContext = model;
        edit.ShowDialog();
    }
}

你是如何维护应用程序中可用的EditingProviders(某个部分)以及如何检索正确的实例,最终将其传递给ViewModel的构造函数?我想这不是所有硬编码的,而是解耦的? - bitbonk
是的,它是解耦的。实际上,我正在使用一个依赖注入框架(Microsoft的组合应用程序块)将泛型接口映射到实现。我目前是在代码中实现这一点,但Unity容器也可以使用配置文件进行配置。 - Botz3000
你有一个MVVM友好的解决方案来在调用ShowDialog之前设置EditWindow的“Owner”属性吗?如果没有设置所有者(例如为MainWindow),模态对话框可能会出现在主窗口后面,这对用户来说相当奇怪和令人困惑。 - Slauma
1
这是一个好问题。上次我遇到这个问题时,我只是确定了当前活动窗口,并将其设置为父窗口。例如,您可以通过查看Application.Current.Windows并查看哪个窗口的IsActive属性设置为true来实现这一点。我想我是在Window构造函数中完成的。不过我已经不太确定了。 - Botz3000
太好了!我刚试了一下,似乎可以工作。很高兴我问了这个问题 - 我已经在考虑将 Window 实例传递到我的 ViewModel 中并移动它们,只是为了最终将其传递给我的 Dialog 服务,在那里创建对话框。你的解决方案更简单。非常感谢你的提示! - Slauma

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