关于wpf:为什么MVVM及其核心优点是什么?

Why MVVM and what are it's core benefits?

为什么在处理WPF时我们选择通过MVC或MVP进行MVVM?

通过使用此方法,我们还能获得什么额外的好处?

编辑:

老实说,今天我接受了采访,有人问我这个问题。 我像INotifyPropertyChanged,ICommand,IValue Convertor ..那样回答,但是他不满意。 从今以后我提出了这个问题

提前致谢


我将为您介绍Jason Dolinger的特别有用的视频。

来自WinForms的世界,实现任何MVX样式模式似乎都比它值得的麻烦。但是,在与WPF合作了几年之后,我可以坦白地说,我不会考虑其他任何事情。开箱即用地支持整个范例。

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

其次,尽管您的model可能包含您在view中可能需要的所有数据,但您可能希望以model不支持的方式来抽象该数据。例如,假设您的模型包含date属性。在模型中,它可以单独作为DateTime对象存在,但是您的视图可能希望以完全不同的方式呈现它。没有viewmodel,您将不得不在model中复制属性以支持视图,或者修改可能严重混淆"模型"的属性。

您还可以使用viewmodel聚合模型中存在于单独的类/库中的部分,以简化view的界面。您不太可能希望以用户希望或希望将数据呈现给他们的相同方式来处理代码中的数据。

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

我确实有很多额外的东西可以解决,但是Jason说我可以做的更好,所以我的建议是观看视频。经过几天的工作,您会想知道没有它会怎样。

祝好运。


这些是我的MVVM特有的

  • 提高视图的"可混合性"(使用Expression Blend设计视图的能力)。这样就可以将团队的职责分离开来,而这些团队很幸运能够拥有一名设计师和一名程序员……彼此可以独立工作。
  • "无望"视图逻辑。视图与运行在其后的代码无关,从而可以在多个视图之间重用相同的视图逻辑,也可以轻松地对视图进行重新设置或替换。将"行为"和"样式"之间的关注分开。
  • 没有重复的代码来更新视图。在后面的代码中,您会看到很多对" myLabel.Text = newValue"的调用。使用MVVM,只需设置基础属性及其所有视图副作用,就可以确保视图得到适当更新。
  • 可测试性。由于您的逻辑完全不了解您的视图(没有" myLabel.Text"引用),因此简化了单元测试。您可以在不涉及View的情况下测试ViewModel的行为。这也使视图行为的测试驱动开发成为可能,而使用后台代码几乎是不可能的。
  • 就它们所关注的问题而言,其他两种模式实际上是分开的。您可以将MVVM与MVP和MVC一起使用(那里的大多数最佳示例都可以执行此操作)。

    实际上,我认为MVP(带有被动视图,而不是监督控制器)实际上只是MVVM的一种。


    WPF具有比任何其他UI框架更好的数据绑定,如果没有这些框架,MVVM将是不守常规的

    MVVM提供了单元可测试性和出色的视图不可知论性,使其成为一件好事


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


    我个人认为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的东西。那就是所谓的VM。

    附带说明,MVVM的替代方法是构建V&M(不包含VM管道)组合,其中M与WPF兼容,但仍具有合理的UI独立性。从历史上看,ObservableCollection位于WindowsBase.dll程序集(随WPF一起提供)中,因此将通用模型绑定到与UI技术相关联的东西真的很奇怪。从那以后,它已移回System.dll。即使这样,有时也很难保持纯虚拟机模型,而无需专门为WPF调整M ...


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