在MVVM中,ViewModel或View应该负责创建新视图吗?


11

在我的WPF应用程序中,我想创建一个新视图。在ViewModelModel中应该在哪里做?

该应用程序是一个(现在非常简单)单窗口形式的工具,带有单个“发送”按钮。如果选中其中一个复选框,则应弹出使用相同ViewModel的新窗口,要求用户提供一些其他详细信息。出于这个问题的目的,我们只考虑新窗口方法,而不考虑显示/隐藏面板之类的其他方法。

理想情况下,在View中应该没有任何代码。此外,由于View中没有任何逻辑,因此VM最初需要检查是否需要创建新视图,并且-在需要时-将这种责任退还给View,从而导致代码膨胀。

另一方面,在ViewModel中创建新视图违反了ViewModel不应该了解View的原则。

因此,在View或ViewModel中创建新视图更好吗?


1
我不太了解您的问题。“在View或ViewModel中”是什么意思?ViewModels不会创建视图,视图当然也不会创建自己。
罗伯特·哈维

1
我的意思是,这些层中的哪一层应负责创建新视图-信号必须在操作发生时从某个地方发出。我从这个问题中完全排除了模型,因为它根本不了解前端。
Mac70

也许我不正确地理解您的问题,它们都不应该干扰您的观点。如果要在viewModel中创建新视图,是否有任何理由不使用xaml中的框架通过绑定到当前viewModel来更改Window内容?
Siobhan

Answers:


8

我使用依赖项注入和IViewFactory视图模型中的注入来尊重这两个约束。

A ProductViewModel(例如)呼叫this.viewFactory.Show("Details", this)ProductDetailsView开头的ProductViewModel。它还可以使用打开基于另一个视图模型的视图this.viewFactory.Show<ClientViewModel>()

该实现(实际上有多个用于WinForms,简单的Wpf Windows,带有选项卡的Wpf外壳...)基于一个StructureMap约定。视图通过IView<ProductViewModel>接口指定其视图模型。

因此,视图模型除了其角色(默认视图,详细信息视图等)外,对视图一无所知,并且该视图不包含用于创建另一个视图的代码。此外,视图模型位于单独的程序集中,该程序集不引用任何Wpf程序集。


7

理论答案

如果您使用ViewModel,则具有修饰效果的动作(例如,将鼠标悬停在某一项上突出显示一个项目)是该工具的工作View,而具有“真实”效果的动作(例如,生成一个新窗口)则是该工具的工作ViewModel

因此,创建新窗口是的工作ViewModel。但是,视图和视图都不ViewModel应该知道如何精确地创建窗口,这不是他们职责的一部分,并且属于不同的类。

您可能会争辩说,创建新窗口是的工作View。尽管我不同意,但这样的辩论没有什么价值,因为在实践中,如果您将该代码放在中View,这并不是世界末日,将其移至ViewModel稍后也没有太多工作。。重要的是,创建新窗口的逻辑包含在一个独立的类中,通常是某种WindowFactory。MVVM,MVP,MVC等的要点是您的类职责少且定义明确。这就是为什么你不添加额外责任的ViewViewModel或者Model如果你不需要。

在任何情况下,Window的创建都不属于Model,因为Model甚至不知道有类似GUI的东西。

实际答案

这是关于“具有单个“发送”按钮的单窗口表单工具”。因此,这是我的一个相关答案的无耻插件:为什么使用MVVM?

总结该答案的含义:保持简单。哦,一旦您的单个按钮窗口变得越来越复杂,请记住上面的理论答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.