在M-V-VM中同时拥有Model和ViewModel有什么意义?

时间:2011-12-23 09:39:20

标签: wpf xaml mvvm

我总觉得将模型和视图模型放在一个类中是很诱人的,而且我没有看到这样做的缺点。

必须有充分的理由将它们分开。我错过了什么?

4 个答案:

答案 0 :(得分:7)

ViewModelView软拷贝,即如果您在View上有可更新的ListBox,那么您将拥有ObservableCollection在您的ViewModel中表示列表框中的项目列表。同样,如果Button上有View,则VM会保留Command

Model实际上是View显示的数据。因此,VM中的类型集合可以称为Model类。

E.g。 Employees ListViewView,并且有一个数据上下文,它是EmployeeViewModel类的实例,ObservableCollection属性为Employee类,其中{{1} } class变为Employee

通常ModelView之间存在1-1关系,VMVM之间存在1-N关系。

答案 1 :(得分:3)

该模型是您的应用程序的域,因此包含您的域逻辑,例如业务规则和验证。 ViewModel是视图的模型。它处理用户和视图之间的交互,即当用户单击按钮时,视图模型将处理该交互,并且可以或可以不对模型进行更改。通常在OO语言中,您希望对象只承担一项责任。

在WPF中,ViewModel通常实现INotifyPropertyChange接口,然后由视图观察任何更改。您不希望该模型实现此接口,因为它无论如何都与您的域无关。

分离的另一个原因是,有时您的视图可能不必显示模型中的所有数据。例如,如果您的模型公开了15个属性,但在您的一个视图中,用户只需要查看其中的5个属性。如果将模型放在ViewModel中,视图将暴露给所有15个属性,而如果将模型封装在ViewModel中,那么只有那5个属性会暴露给View。

可能还有很多原因,但总的来说,将它们分开是一个很好的设计原则。话虽如此,如果您的应用程序足够小,您可以放弃将模型和ViewModel放在一起以减少代码中的冗余。

答案 2 :(得分:2)

我的简单答案(我不假装是WPF Guru)将是这样的,在WPF中,你需要一个VM: 1.您不希望将所有模型公开给特定视图 2.您的模型不是“WPF样式”(不实现INotifyPropertyChanged,没有可观察的集合或没有命令)。

答案 3 :(得分:2)

这样做的第一个真正缺点是缺乏关注点分离。很快这将导致冗余代码。现在,也就是说,我已经看过很多次开发人员将他们的Model对象用作ViewModels。如果我们对自己完全诚实,在一个非常薄的应用程序中,分离这些概念实际上可以导致更多的冗余。

你能做的最好的事情是了解MVVM的更多信息,以及它在MVC和Presentation Model中的根源,但我认为你提出这个问题并且不是盲目地遵循教条是件好事。事实上,当我开始使用一个小应用程序时,我甚至根本不会开始使用MVVM。我通常会在代码隐藏中开始使用一百行,证明一个概念,然后开始将其重构为MVVM。

更多问题,模型和视图模型在概念上具有非常不同的目的。该模型包括您的业务逻辑(域逻辑),数据模型(对象,属性和关系)和数据访问层。 ViewModel本质上是Model的适配器,可以根据View的特定用途进行调整。在某些情况下,对于给定的数据模型对象,您可能有3个不同的视图(和视图模型)。每个视图模型都将在模型对象上调整这些相同的属性,以用于特定视图的特定目的。