在WPF中使用MVVM打开新窗口的推荐方法是什么?

时间:2014-01-24 19:10:09

标签: c# wpf events mvvm icommand

大家好,并提前感谢您的时间。

我正在使用WPF学习MVVM,用于我正在编写的小型Biz App。我已经阅读了很多关于MVVM模式的文章,并发现其中一个关键领域是尽可能地将ViewModel与View分离。

我想在我的应用程序中打开一个新窗口,但我不确定是应该使用ICommand从ViewModel打开它还是使用标准事件直接从视图打开它。我工作的人建议我应该使用命令,但后来我认为这意味着在我的ViewModel中引用了一个View,根据我的理解,这正是MVVM模式关注的重点。

我的理解是,如果一个窗口仅用于导航目的,打开新窗口的过程对模型没有影响,那么我应该使用标准事件将所有这些保留在视图上。

我知道在sw开发中所有的东西都“依赖”,但我猜我的问题是否有“正确”/标准的方式来做到这一点?

祝你好运, 丹尼尔

3 个答案:

答案 0 :(得分:5)

是的,VM应该使用Views可以订阅的事件与视图进行通信...

在VM中:

public event EventHandler<NotificationEventArgs<string>> DisplayOptionsNotice;  

在视图中:

private readonly MainViewModel mvm;
...
mvm = DataContext as MainViewModel;
mvm.DisplayOptionsNotice += DisplayOptionsWindow;
...
private void DisplayOptionsWindow(object sender, NotificationEventArgs<string> e)
{
    ...  
    optionsWindow = new OptionsWindow { Owner = this };
    optionsWindow.ShowDialog();
    ...
}

答案 1 :(得分:1)

  

但后来我认为这意味着在我的ViewModel中引用了一个View,根据我的理解,这正是MVVM模式关注的重点。

一般来说,处理方式是通过某种形式的控制反转。大多数MVVM框架将提供某种形式的服务来打开窗口,并使用服务定位器或依赖注入为ViewModel提供服务。

这允许您的ViewModel与特定的视图呈现框架保持分离 - 您将服务传递给新VM并说“在窗口中显示此VM”,并且该代码将是特定于平台的。

答案 2 :(得分:0)

正如Reed所说,服务定位器或DI将完成工作并且不会破坏MVVM模式。 根据我的经验,你将不得不做三件事: 首先检查服务定位器或Di,看看对您更友好并实施它 第二次开始制作IWindow \ IWindowDialog的界面,你的视图(windows \ Messagebox - 如果你愿意)将实现例如。

最后一件事是实现windows \ messages。

从头开始(我做了)需要时间,但如果你一次只关注一件事。 你把时间缩短了一半。

祝你好运