【问题标题】:How do I handle opening and closing new Windows with MVVM?如何使用 MVVM 打开和关闭新 Windows?
【发布时间】:2010-11-30 16:49:20
【问题描述】:

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

【问题讨论】:

  • 我在this post回答了一个非常相似的问题。

标签: wpf mvvm dialog window


【解决方案1】:

我通常为此使用接口。 例如,如果我想在单独的窗口中编辑记录,我有一个接口 IEditingProvider,我可以在其他地方实现它,然后将接口引用传递给我的 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();
    }
}

【讨论】:

  • 如何维护应用程序(某个部分)可用的 EditingProvider,以及如何检索最终将传递给 ViewModel 构造函数的正确实例?我想这不是硬连线而是解耦的?
  • 是的,它是解耦的。实际上,我正在使用依赖注入框架(Microsoft 的复合应用程序块)将通用接口映射到实现。我目前在代码中这样做,但 Unity Container 也可以使用配置文件进行配置。
  • 在调用 ShowDialog 之前,您是否有对 MVVM 友好的解决方案来设置 EditWindow 的 Owner 属性?如果没有设置所有者(例如,主窗口),模式对话框可能会出现在主窗口后面,这从用户的角度来看是非常奇怪和令人困惑的。
  • 这是个好问题。上次我遇到这个问题时,我只是确定了当前活动的窗口并将其设置为父窗口。例如,您可以通过查看 Application.Current.Windows 并查看哪个 IsActive 设置为 true 来做到这一点。我想我是在 Window 构造函数中做到的。不过我不确定了。
  • 很好!我刚试过这个,它似乎工作。很好,我问了 - 我已经在考虑将 Window 实例传递到我的 ViewModel 中并移动它们只是为了让所有者最终进入我创建对话框的 Dialog 服务。你的是一个更简单的解决方案。非常感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多