【发布时间】:2010-12-11 07:05:18
【问题描述】:
为什么我们在处理 WPF 时选择 MVVM 而不是 MVC 或 MVP?
使用这个我们可以获得什么额外的好处?
编辑:
说实话,今天我接受了采访,被问到这个问题。我的回答像 INotifyPropertyChanged 、 ICommand、IValue 转换器.. 但他不满意。从此我提出了这个问题
提前致谢
【问题讨论】:
-
我一直将 MVVM 视为 MVC 的一种变体。
为什么我们在处理 WPF 时选择 MVVM 而不是 MVC 或 MVP?
使用这个我们可以获得什么额外的好处?
编辑:
说实话,今天我接受了采访,被问到这个问题。我的回答像 INotifyPropertyChanged 、 ICommand、IValue 转换器.. 但他不满意。从此我提出了这个问题
提前致谢
【问题讨论】:
我会告诉你一个特别有用的 video Jason Dolinger。
来自 WinForms 世界,实现任何 MVX 样式模式似乎比它的价值更麻烦,但在使用 WPF 几年之后,我可以诚实地说,我不会考虑任何更少的事情。开箱即用地支持整个范例。
首先,主要好处是能够真正分离view 和model。这实际上意味着如果/当您的模型需要更改时,它可以不需要视图,反之亦然。
其次,虽然您的model 可能包含您在view 中可能需要的所有数据,但您可能希望以model 不支持的方式抽象这些数据。例如,假设您的模型包含一个日期属性。在模型中,它可以单独作为 DateTime 对象存在,但您的视图可能希望以完全不同的方式呈现它。如果没有viewmodel,您要么必须复制model 中的属性以支持视图,要么修改可能严重混淆“模型”的属性。
您还可以使用viewmodel 来聚合存在于不同类/库中的模型部分,以便为view 处理提供更流畅的界面。您非常不太可能希望以用户希望或希望将数据呈现给他们的方式处理代码中的数据。
最重要的是,您将获得对view 和viewmodel 之间自动双向数据绑定的支持。
确实有一大堆额外的东西我可以大谈特谈,但 Jason 说我能做到远更好,所以我的建议是观看视频。像这样工作几天后,你会想知道没有它你是怎么过的。
祝你好运。
【讨论】:
这些是我特定于 MVVM 的
其他两种模式就它们所解决的问题而言确实有些不同。您可以将 MVVM 与 MVP 和 MVC 一起使用(大多数优秀的示例都可以做到这一点)。
事实上,在我看来,MVP(带有被动视图,而不是监督控制器)实际上只是 MVVM 的一种变体。
【讨论】:
WPF 比任何其他 UI 框架都有更好的数据绑定,没有它 MVVM 会不守规矩
MVVM 提供单元可测试性和出色的视图不可知性,这使其成为使用的好东西
【讨论】:
Baked 支持 ICommand 和 INotifyPropertyChanged 是两个最大的好处。使用 MVVM 可以很容易地连接命令并将数据插入 WPF UI。一切正常。
【讨论】:
我个人认为 MVVM 不是一种好处,而是对于那些想要使用 WPF 酷炫功能的人来说是一种义务。
WPF 以数据绑定为核心构建,以实现 UI 与模型的分离。但是从技术上讲,WPF 中数据绑定的方式有些特殊,因为它与以下类相关联:
因此,您无法使用标准 .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...
【讨论】:
XAML 代码的数据绑定能力以及触发器的存在将破坏 MVP 和 MVC 模式。
【讨论】: