为什么MVVM及其核心优势是什么?

时间:2009-10-29 15:15:39

标签: wpf mvvm

为什么我们在处理WPF时会使用MVM而不是MVC?

使用它可以获得多大的好处?

编辑:

说实话,今天我接受了一次采访,我被问到了这个问题。我的答案像INotifyPropertyChanged,ICommand,IValue Convertor ..但他并不满意。从此我提出了这个问题

提前致谢

6 个答案:

答案 0 :(得分:45)

我会指出Jason Dolinger特别有用的video

来自WinForms世界,实现任何MVX风格模式似乎比它的价值更麻烦但是在与WPF合作几年之后,我可以诚实地说我不会考虑更少。整个范例都是开箱即用的。

首先,关键的好处是在viewmodel之间实现真正的分离。实际意义上的含义是,如果/当您的模型需要更改时,它可以在没有视图需要的情况下反之亦然。

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

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

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

确实有一大堆额外的东西我可以喋喋不休但Jason说它更好,所以我的建议是观看视频。经过这样的工作几天后,你会想知道如果没有它你会如何度过。

祝你好运。

答案 1 :(得分:17)

这些是我特有的MVVM

  1. 提高视图的“可混合性”(使用Expression Blend设计视图的功能)。这样就可以将团队中的责任分离出来,这些团队很幸运,有一个设计师和一个程序员......每个人都可以独立于另一个人工作。
  2. “无视”视图逻辑。视图与在其后面运行的代码无关,使得相同的视图逻辑可以在多个视图中重用,或者可以轻松地重新组织或替换视图。分离“行为”和“风格”之间的关注。
  3. 没有重复的代码来更新视图。在代码隐藏中,你会看到很多对“myLabel.Text = newValue”的调用随处可见。使用MVVM,您可以确保仅通过设置基础属性及其所有视图副作用来适当更新视图。
  4. 测试性即可。由于您的逻辑完全不了解您的视图(没有“myLabel.Text”引用),因此单元测试变得简单。您可以在不涉及其视图的情况下测试ViewModel的行为。这也启用了视图行为的测试驱动开发,使用代码隐藏几乎是不可能的。
  5. 其他两种模式在他们所关注的问题上实际上是分开的。你可以将MVVM与MVP和MVC一起使用(大多数好的样本都有这种形式)。

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

答案 2 :(得分:5)

WPF具有比任何其他UI框架更好的数据绑定,如果没有

,MVVM将是不可靠的

MVVM提供单元可测试性和出色的视图不可知性,这使得使用它成为一件好事

答案 3 :(得分:3)

支持ICommand和INotifyPropertyChanged是两个最大的好处。使用MVVM可以很容易地将命令连接起来并将数据插入WPF UI。事情就好了。

答案 4 :(得分:1)

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

WPF非常强大,内核具有数据绑定功能,可以将UI与模型分离。但是在WPF技术上完成数据绑定的方式有点特殊,因为它与以下类绑定:

  • 的DependencyProperty
  • INotifyPropertyChanged的
  • 的ObservableCollection

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

所以,让我们说V代表XAML代码及其代码隐藏对应物(因此它与WPF作为一项技术绑定),让我们说M代表你的模型(因此它无论如何都与WPF UI技术无关)。

嗯,你永远不会在WPF下只使用这些V&微米。

必须在两者之间添加内容。与WPF兼容并了解您的模型的东西。说DependencyProperty,ObservableCollection和INotifyPropertyChanged的东西。这就是所谓的VM。

作为旁注,MVVM的替代方案是构建一个V& M(没有VM管道)组合M与WPF兼容,但仍具有合理的UI独立性。从历史上看,ObservableCollection是在WindowsBase.dll程序集中(随WPF一起提供),因此将通用模型绑定到与UI技术相关的东西真的很奇怪。它从那时起被移回System.dll。即便如此,有时很难保持一个纯VM模型,而不是专门为WPF调整M ...

答案 5 :(得分:0)

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