我总觉得将模型和视图模型放在一个类中是很诱人的,而且我没有看到这样做的缺点。
必须有充分的理由将它们分开。我错过了什么?
答案 0 :(得分:7)
ViewModel
是View
的软拷贝,即如果您在View上有可更新的ListBox
,那么您将拥有ObservableCollection
在您的ViewModel中表示列表框中的项目列表。同样,如果Button
上有View
,则VM
会保留Command
。
Model
实际上是View
显示的数据。因此,VM
中的类型集合可以称为Model
类。
E.g。 Employees ListView
是View
,并且有一个数据上下文,它是EmployeeViewModel
类的实例,ObservableCollection
属性为Employee
类,其中{{1} } class变为Employee
。
通常Model
与View
之间存在1-1关系,VM
与VM
之间存在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个不同的视图(和视图模型)。每个视图模型都将在模型对象上调整这些相同的属性,以用于特定视图的特定目的。