【问题标题】:Why MVVM and what are it's core benefits? [duplicate]为什么选择 MVVM,它的核心优势是什么? [复制]
【发布时间】:2010-12-11 07:05:18
【问题描述】:

为什么我们在处理 WPF 时选择 MVVM 而不是 MVC 或 MVP?

使用这个我们可以获得什么额外的好处?

编辑:

说实话,今天我接受了采访,被问到这个问题。我的回答像 INotifyPropertyChanged 、 ICommand、IValue 转换器.. 但他不满意。从此我提出了这个问题

提前致谢

【问题讨论】:

  • 我一直将 MVVM 视为 MVC 的一种变体。

标签: wpf mvvm


【解决方案1】:

我会告诉你一个特别有用的 video Jason Dolinger。

来自 WinForms 世界,实现任何 MVX 样式模式似乎比它的价值更麻烦,但在使用 WPF 几年之后,我可以诚实地说,我不会考虑任何更少的事情。开箱即用地支持整个范例。

首先,主要好处是能够真正分离viewmodel。这实际上意味着如果/当您的模型需要更改时,它可以不需要视图,反之亦然。

其次,虽然您的model 可能包含您在view 中可能需要的所有数据,但您可能希望以model 不支持的方式抽象这些数据。例如,假设您的模型包含一个日期属性。在模型中,它可以单独作为 DateTime 对象存在,但您的视图可能希望以完全不同的方式呈现它。如果没有viewmodel,您要么必须复制model 中的属性以支持视图,要么修改可能严重混淆“模型”的属性。

您还可以使用viewmodel 来聚合存在于不同类/库中的模型部分,以便为view 处理提供更流畅的界面。您非常不太可能希望以用户希望或希望将数据呈现给他们的方式处理代码中的数据。

最重要的是,您将获得对viewviewmodel 之间自动双向数据绑定的支持。

确实有一大堆额外的东西我可以大谈特谈,但 Jason 说我能做到更好,所以我的建议是观看视频。像这样工作几天后,你会想知道没有它你是怎么过的。

祝你好运。

【讨论】:

【解决方案2】:

这些是我特定于 MVVM 的

  1. 提高视图的“混合性”(使用 Expression Blend 设计视图的能力)。这使得有幸拥有设计师和程序员的团队能够实现职责分离......每个人都可以独立工作。
  2. “无视”视图逻辑。视图与在它们后面运行的代码无关,从而使相同的视图逻辑能够在多个视图中重复使用,或者使视图易于重组或替换。区分“行为”和“风格”之间的关注点。
  3. 没有重复的代码来更新视图。在代码隐藏中,您会看到到处都是对“myLabel.Text = newValue”的调用。使用 MVVM,您只需设置底层属性及其所有视图副作用即可确保视图得到适当更新。
  4. 可测试性。由于您的逻辑与您的视图完全无关(没有“myLabel.Text”引用),因此单元测试变得容易。您可以在不涉及视图的情况下测试 ViewModel 的行为。这也启用了视图行为的测试驱动开发,这几乎是使用代码隐藏不可能实现的。

其他两种模式就它们所解决的问题而言确实有些不同。您可以将 MVVM 与 MVP 和 MVC 一起使用(大多数优秀的示例都可以做到这一点)。

事实上,在我看来,MVP(带有被动视图,而不是监督控制器)实际上只是 MVVM 的一种变体。

【讨论】:

  • 2 和 4 适用于 MVC 或 MVP 以及 MVVM。
  • 是的...我忽略了这些模式,因为它们确实解决了典型应用程序的稍微不同的方面。我已编辑我的答案以包含此内容。
【解决方案3】:

WPF 比任何其他 UI 框架都有更好的数据绑定,没有它 MVVM 会不守规矩

MVVM 提供单元可测试性和出色的视图不可知性,这使其成为使用的好东西

【讨论】:

    【解决方案4】:

    Baked 支持 ICommand 和 INotifyPropertyChanged 是两个最大的好处。使用 MVVM 可以很容易地连接命令并将数据插入 WPF UI。一切正常。

    【讨论】:

    • 说实话,今天我有一个面试,被问到这个问题。我也回答了几乎相同的问题,例如 INotifyPropertyChanged 、 ICommand,IValue Converter.. 但他并不满意。从此我提出了这个问题。
    【解决方案5】:

    我个人认为 MVVM 不是一种好处,而是对于那些想要使用 WPF 酷炫功能的人来说是一种义务。

    WPF 以数据绑定为核心构建,以实现 UI 与模型的分离。但是从技术上讲,WPF 中数据绑定的方式有些特殊,因为它与以下类相关联:

    • 依赖属性
    • INotifyPropertyChanged
    • ObservableCollection

    因此,您无法使用标准 .NET 技术以您想要的方式编写模型。例如,WPF TreeView 几乎不可能在不使用数据绑定和模板的情况下使用。例如,您不能像从 Winforms 中的通用模型那样简单地填充它。它必须绑定到使用 ObservableCollection 来表示节点的子节点的层次模型。

    假设 V 代表 XAML 代码并且它是代码隐藏对应物(因此它与 WPF 作为一种技术相关联),假设 M 代表您的模型(因此它无论如何都与 WPF UI 技术无关)。

    好吧,只有这些 V 和 M,你永远无法在 WPF 下正常工作。

    必须在两者之间添加一些内容。与 WPF 兼容并了解您的模型的东西。说 DependencyProperty、ObservableCollection 和 INotifyPropertyChanged 的​​东西。这就是所谓的虚拟机。

    作为旁注,MVVM 的替代方案是构建一个 V & M(无 VM 管道)组合,其中 M 与 WPF 兼容,但仍具有合理的 UI 独立性。从历史上看,ObservableCollection 位于 WindowsBase.dll 程序集(随 WPF 一起提供)中,因此将泛型模型绑定到与 UI 技术相关的东西确实看起来很奇怪。从那以后,它已被移回 System.dll。即使这样,有时也很难保持一个纯 VM 模型而无需专门为 WPF 调整 M...

    【讨论】:

    • 是的,同意您所说的大部分内容,但 WPF 的数据绑定在代码背后以及 VM 中都非常有效。 OC、INPC 和 DP 在没有 MVVM 的情况下都可以很好地工作。 WPF 的真正威力在于数据绑定而不是 MVVM。我们在背后构建 MVVM 和代码,两者都具有出色的数据绑定。
    【解决方案6】:

    XAML 代码的数据绑定能力以及触发器的存在将破坏 MVP 和 MVC 模式。

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 2015-12-06
      • 2016-10-27
      • 2010-09-06
      • 2011-09-03
      • 2011-05-26
      • 2012-09-01
      • 1970-01-01
      • 2020-02-02
      相关资源
      最近更新 更多