【问题标题】:What is the point of having both Model and ViewModel in M-V-VM?在 M-V-VM 中同时拥有 Model 和 ViewModel 有什么意义?
【发布时间】:2011-12-23 09:39:19
【问题描述】:

我总是觉得将模型和视图模型放在一个类中很诱人,我不认为这样做有什么坏处。

必须有充分的理由将它们分开。我错过了什么?

【问题讨论】:

    标签: wpf xaml mvvm


    【解决方案1】:

    ViewModelView软拷贝,即如果您在 View 上有一个可更新的 ListBox,您的 ViewModel 中将有一个 ObservableCollection,它代表 列表框中的项目列表。同样,如果您的View 上有Button,则VM 将保留其Command

    Model 实际上就是View 显示的数据。所以VM 中的类型集合是属于的,可以称为Model 类。

    例如一个Employees ListView 是一个View,并且有一个数据上下文是EmployeeViewModel 类的实例,该类具有Employee 类的ObservableCollection 属性,其中Employee 类变为Model

    通常ViewVM之间存在1-1关系,VMModel之间存在1-N关系。

    【讨论】:

    • 对不起,我的英文不好,看不懂这句话:“所以你VM中的类型集合是of,可以称为Model类。”你能再解释一下吗?
    • 我的意思是如果你有一个带有员工列表框的视图,那么你的视图模型应该有一个 ObservableCollection 因此你的模型是 Employee.
    【解决方案2】:

    模型是您的应用程序的域,因此包含您的域逻辑,例如业务规则和验证。 ViewModel 是您的视图的模型。它处理用户和视图之间的交互,即当用户单击按钮时,视图模型将处理该交互,并且可能会或可能不会对模型进行更改。通常在 OO 语言中,您希望您的对象仅具有单一职责。

    在 WPF 中,ViewModel 通常实现 INotifyPropertyChange 接口,然后视图会观察该接口是否有任何更改。您不希望模型实现此接口,因为它与您的域无关。

    分离的另一个原因是有时您的视图可能不需要显示模型中的所有数据。例如,如果您的模型公开了 15 个属性,但在您的一个视图中,用户只需要查看其中的 5 个属性。如果您将模型放在 ViewModel 中,则视图将公开给所有 15 个属性,而如果您将模型封装在 ViewModel 中,则只有这 5 个属性将公开给视图。

    可能还有很多原因,但总的来说,将它们分开是一个很好的设计原则。话虽如此,如果您的应用程序足够小,您可以将模型和 ViewModel 放在一起以减少代码中的冗余。

    【讨论】:

    • 赞成 - 老实说,我在写我的答案之前没有阅读您的答案,但看起来我们涵盖了一些相同的领域。这是一个比投票领导者更好的答案,并给出了很好的具体例子。
    【解决方案3】:

    这样做的第一个真正缺点是缺乏关注点分离。很快这将导致冗余代码。现在,就是说,我已经看到很多次开发人员将他们的模型对象用作视图模型。如果我们对自己完全诚实,在一个非常薄的应用程序中,分离这些概念实际上会导致更多的冗余。

    您能做的最好的事情是更多地了解 MVVM,以及它在 MVC 和演示模型中的根源,但我认为您提出这个问题并且您没有盲目地遵循教条是一件好事。事实上,当我开始一个小应用程序时,我什至根本不会从 MVVM 开始。我通常会在代码隐藏中从一百行左右开始,证明一个概念,然后开始将其重构为 MVVM。

    更重要的是您的问题,从概念上讲,模型和视图模型具有非常不同的目的。模型包括您的业务逻辑(领域逻辑)、数据模型(对象、属性和关系)和数据访问层。 ViewModel 本质上是 Model 的适配器,针对 View 的特定目的进行调整。在某些情况下,对于给定的数据模型对象,您可能有 3 个不同的视图(和视图模型)。每个视图模型都会针对特定视图的特定目的调整模型对象上的相同属性。

    【讨论】:

      【解决方案4】:

      我的简单答案(我不会假装是WPF Guru)是,在 WPF 中,您需要一个虚拟机:
      1. 您不想将所有模型暴露给特定视图
      2. 您的模型不是“WPF 风格”(没有实现 INotifyPropertyChanged,没有可观察的集合或没有命令)。

      【讨论】:

        猜你喜欢
        • 2017-07-16
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        相关资源
        最近更新 更多