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

C# 在WPF中使用MVVM打开新窗口的推荐方法是什么,c#,wpf,events,mvvm,icommand,C#,Wpf,Events,Mvvm,Icommand,大家好,提前谢谢你们抽出时间 我目前正在学习使用WPF为我正在编写的一个小型商务应用程序开发MVVM。我读过很多关于MVVM模式的文章,发现其中一个关键领域是尽可能地将ViewModel与视图解耦 我想在我的应用程序中打开一个新窗口,但我不确定是应该使用ICommand从ViewModel打开它,还是直接使用标准事件从视图打开它。我的同事建议我应该使用命令,但后来我认为这意味着在我的ViewModel中引用一个视图,据我所知,这正是MVVM模式重点避免的 我的理解是,如果一个窗口仅为导航目的而打

大家好,提前谢谢你们抽出时间

我目前正在学习使用WPF为我正在编写的一个小型商务应用程序开发MVVM。我读过很多关于MVVM模式的文章,发现其中一个关键领域是尽可能地将ViewModel与视图解耦

我想在我的应用程序中打开一个新窗口,但我不确定是应该使用ICommand从ViewModel打开它,还是直接使用标准事件从视图打开它。我的同事建议我应该使用命令,但后来我认为这意味着在我的ViewModel中引用一个视图,据我所知,这正是MVVM模式重点避免的

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

我知道在软件开发中,一切都“取决于”,但我想问的是,是否有一种“正确的”/“标准的方法”可以做到这一点

致以最良好的祝愿, 丹尼尔

但后来我认为这意味着在我的ViewModel中有一个对视图的引用,据我所知,这正是MVVM模式所要避免的

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


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

是的,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();
    ...
}
private readonly MainViewModel mvm;
...
mvm=作为MainViewModel的DataContext;
mvm.displayOptions通知+=显示选项窗口;
...
私有void显示选项窗口(对象发送者、通知事件参数e)
{
...  
optionsWindow=newoptionsWindow{Owner=this};
选项Window.ShowDialog();
...
}

正如里德所说,服务定位器或DI将完成这项工作,不会破坏MVVM模式。 根据我的经验,你必须做三件事: 首先检查服务定位器或Di,看看有什么对您更友好,然后实施它。
第二步开始制作视图(windows\Messagebox-如果愿意)将实现的iWindows\iWindows对话框接口

最后一件事是实现windows\消息

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


祝你好运

谢谢,我觉得你的评论很有趣,你对这个话题有什么进一步的建议吗?@Daniel请看一下MVVM Light的Messenger类,了解这里使用的一种方法的示例。忘了提到我没有使用特定的MVVM框架。认为从头开始学习是最好的学习方式。@Daniel是的-我只是指出了一个寻找想法的地方。不过,任何DI框架或服务定位器方法都可以。对不起。。。怎样?VM只发布一个事件,它不知道应该打开哪个窗口。@ReedCopsey怎么会这样?VM只发布任何感兴趣的对象都可以访问的事件。。。如果您指的是在视图中有对VM的引用,VM已经是视图的DataContext,所以它无论如何都会与之耦合…@DeanK。是的-这是一个更紧密的耦合(视图最终会有代码隐藏,需要直接引用/了解VM)。我并不认为这有什么问题,但在很多MVVM纯粹主义者看来,这是“不好的”。你们从我这里得到了+1,但我想我应该指出这一点。我不应该写感谢评论,但我目前的声誉阻止我给你们“+1”,所以谢谢你们。我只是问了一个问题,看看是否有MVVM纯粹主义者能想出不使用这种模式的好理由。。。关于MVVM Light的Messenger类的进一步阅读: