【问题标题】:ViewModel per View or per Model?每个视图或每个模型的视图模型?
【发布时间】:2012-03-13 20:34:41
【问题描述】:

在 MVVM 模式中,每个视图只有一个 ViewModel,还是每个模型只有一个 ViewModel?

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    理论上,关系是

    视图 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 - 通常你会遇到很多维护问题...

    【讨论】:

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

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

    【讨论】:

      【解决方案3】:

      视图 n - 1 ViewModel n - 1 模型

      【讨论】:

      • 你能解释一下这是什么意思吗?
      • 我不明白这是在说什么。破折号是减号(n-1)还是分隔符? n 是什么意思?
      【解决方案4】:

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

      多视图到单视图模型:

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

      单视图到多视图模型:

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

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

      【讨论】:

        猜你喜欢
        • 2019-10-03
        • 2022-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多