每个视图或每个模型的ViewModel?

时间:2012-02-23 12:25:56

标签: wpf mvvm

在MVVM模式中,每个View是否只有一个ViewModel,或者每个模型只有一个ViewModel?

4 个答案:

答案 0 :(得分:23)

理论上,关系是

  

查看n - 1 ViewModel n - 1模型

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

通常,在业务应用程序中,存在数据访问层(DAL)。 DAL的实体通常都是您的模型。有时您应该使用其他类包装这些实体以提供扩展功能或者某些其他属性。也许你有自己的模特......

ViewModels和Views(实际上)通常具有1对1的关系。类似的东西 - 每个屏幕(或屏幕的一部分)实际上是一个配对的View和ViewModel。我认为通常只是 - 视图是UI层,ViewModel是代码隐藏级别。 View只是XAML文件 - 表示层。并且(最佳实践)其他一切应该在ViewModel中 - 所有数据接收进程,所有命令,所有可更改字段等。这种方式通常可以测试ViewModel(带单元测试)。一个ViewModel通常只有在您拥有共享的ViewModel时才能拥有多个视图(实际上),例如,DesktopApplication(WPF),Web应用程序(Silverlight)和Windows Phone。像这样的东西。但通常 - 一个ViewModel - 一个View。如果你有一个ViewModel的几个视图 - 通常你会有很多维护问题......

答案 1 :(得分:8)

查看n - 1 ViewModel n - 1模型

答案 2 :(得分:5)

每个视图模型有一个模型,每个视图有一个视图模型,在另一个方向上,一切都是n。

答案 3 :(得分:4)

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

多视图到一个ViewModel:

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

One-View to many-ViewModels:

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

通过混合和匹配Views和ViewModel,您可以通过清晰分离Views和ViewModel获得巨大优势。