【发布时间】:2012-03-13 20:34:41
【问题描述】:
在 MVVM 模式中,每个视图只有一个 ViewModel,还是每个模型只有一个 ViewModel?
【问题讨论】:
在 MVVM 模式中,每个视图只有一个 ViewModel,还是每个模型只有一个 ViewModel?
【问题讨论】:
理论上,关系是
视图 n - 1 ViewModel n - 1 模型
我知道,很多人会咬我,打我,但是……实际上……
在业务应用程序中,通常存在数据访问层 (DAL)。来自 DAL 的实体通常是您的模型。有时你应该用额外的类来包装这些实体,以提供扩展功能或一些额外的属性。也许你有自己的模型......
ViewModels 和 Views(在实践中)通常具有 1 对 1 的关系。类似的东西 - 每个屏幕(或屏幕的一部分)实际上是成对的 View 和 ViewModel。我认为通常就像 - View 是 UI 层,而 ViewModel 是代码隐藏级别。视图只是 XAML 文件 - 表示层。并且(最佳实践)其他一切都应该在 ViewModel 中——所有数据接收过程、所有命令、所有可变字段等。这样您通常可以测试 ViewModel(通过单元测试)。一个 ViewModel 可以有多个 View(实际上),通常只有当您共享 ViewModel 时,例如 DesktopApplication (WPF)、Web Application (Silverlight) 和 Windows Phone。像这样的东西。但通常 - 一个 ViewModel - 一个 View。如果一个 ViewModel 有多个 View - 通常你会遇到很多维护问题...
【讨论】:
每个视图模型有一个模型,每个视图一个视图模型,在另一个方向上,一切都是 n。
【讨论】:
视图 n - 1 ViewModel n - 1 模型
【讨论】:
n 是什么意思?
可以为同一个视图模型使用多个视图,也可以为同一视图使用多个不同的视图模型。
多视图到单视图模型:
例如,在主-细节排列中,您可以将视图模型放入 ObservableCollection 并将它们呈现在 ListBox 中,您可以在其中将项目显示绑定到 ViewModel 的 Title 属性。 ListBox 呈现您的视图模型的一个视图。然后 ListBox.SelectedItem 绑定到不同的视图,该视图显示所选模型的详细信息。
单视图到多视图模型:
从一组共享公共属性名称的视图模型开始,您可以在同一个视图中显示所有视图模型。例如,您可以有一个由 Title 属性和 ModelValue 属性组成的简单视图模型。在所有视图模型中,Title 属性都是字符串,但每个不同的视图模型的 ModelValue 属性可能具有不同的数据类型。 StringViewModel 将具有字符串 ModelValue,而 DoubleViewModel 将具有双 ModelValue。不同视图模型的表示可以共享相同的视图,该视图由一个用于显示标题的 TextBlock 和一个用于编辑 ModelValue 的 TextBox 组成。这适用于 TextBox 中可编辑的任何类型。
通过混合和匹配视图和视图模型,您可以从视图和视图模型的清晰分离中获得巨大优势。
【讨论】: