每个视图一个ViewModel还是每个模型一个ViewModel?

26
在MVVM模式中,每个View是否只有一个ViewModel?还是每个Model只有一个ViewModel?
4个回答

33

从理论上讲,关系是

查看 n - 1 视图模型 n - 1 模型

我知道,很多人会咬我打我,但是... 在实践中...

在业务应用程序中,通常会有数据访问层(DAL)。而通常来自DAL的实体就是您的模型(Model)。有时候,您可能需要使用其他类来包装这些实体以提供扩展功能或者添加一些额外的属性。也许您有自己的Models...

ViewModel和View(在实践中)通常具有1对1的关系。例如,每个屏幕(或屏幕的一部分)实际上都是一个配对的View和ViewModel。我认为通常只是像这样——View是UI层,而ViewModel是代码后备级别,View只是XAML文件——表示层。并且(最佳实践)所有其他内容都应该在ViewModel中,比如所有接收数据的过程,所有命令,所有可更改的字段等。这样通常可以测试ViewModel(通过单元测试)。一个ViewModel可以有多个Views(在实践中)通常只有当您对桌面应用程序(WPF),Web应用程序(Silverlight)和Windows Phone使用共享ViewModels时才会有多个Views。像这样。但通常——一个ViewModel——一个View。如果您有多个Views用于一个ViewModel——通常会有很多维护问题...


我对WPF和MVVM仍然是一个初学者,但即使在理论上,我也不认为应该是一个ViewModel对应一个Model。ViewModel保存与实际查看Model相关的数据,并且这些数据将根据您查看Model的方式而有所不同。例如,它将需要一个Selected属性来查看分页网格视图,并且在编辑视图中需要一个SaveChanges命令,这两个属性都与另一个视图无关。 - Clonkex

8
每个视图模型对应一个模型,每个视图对应一个视图模型,在另一方面则是n。

5

可以使用多个视图来呈现同一个视图模型,也可以使用多个不同的视图模型来呈现同一个视图。

多个视图对应一个视图模型:

例如,在主细节安排中,您可以将您的视图模型放入一个ObservableCollection中,并在其中呈现它们,然后将ListBox的项显示绑定到ViewModel的Title属性。ListBox呈现了您的视图模型的一个视图。然后,ListBox.SelectedItem绑定到另一个视图,用于呈现所选模型的详细信息。

一个视图对应多个视图模型:

从一组具有共同属性名称的视图模型开始,您可以在同一个视图中呈现所有视图模型。例如,您可以拥有一个简单的视图模型,由Title属性和ModelValue属性组成。在所有视图模型中,Title属性都将是字符串,但每个不同的视图模型可以为ModelValue属性具有不同的数据类型。StringViewModel将具有string ModelValue,而DoubleViewModel将具有double ModelValue。这些不同视图模型的呈现可以共享相同的视图,该视图包含TextBlock以呈现Title和TextBox以编辑ModelValue。这适用于在TextBox中可编辑的任何类型。

通过混合和匹配视图和视图模型,您可以从干净的视图和视图模型分离中获得巨大的优势。


4

查看 n - 1 ViewModel n - 1 模型


6
你能解释一下这是什么意思吗? - Coder
2
我不明白这句话的意思。这些破折号是减号(n-1),还是除号?n代表什么? - Clonkex
2
由于您在评论中询问后仍未解释,因此我会给您点个踩。 - Cyber Avater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接