大家好,并提前感谢您的时间。
我正在使用WPF学习MVVM,用于我正在编写的小型Biz App。我已经阅读了很多关于MVVM模式的文章,并发现其中一个关键领域是尽可能地将ViewModel与View分离。
我想在我的应用程序中打开一个新窗口,但我不确定是应该使用ICommand从ViewModel打开它还是使用标准事件直接从视图打开它。我工作的人建议我应该使用命令,但后来我认为这意味着在我的ViewModel中引用了一个View,根据我的理解,这正是MVVM模式关注的重点。
我的理解是,如果一个窗口仅用于导航目的,打开新窗口的过程对模型没有影响,那么我应该使用标准事件将所有这些保留在视图上。
我知道在sw开发中所有的东西都“依赖”,但我猜我的问题是否有“正确”/标准的方式来做到这一点?
祝你好运, 丹尼尔
答案 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。
从头开始(我做了)需要时间,但如果你一次只关注一件事。 你把时间缩短了一半。
祝你好运