我对MVVM模式有一些疑问

时间:2009-06-15 18:41:37

标签: c# wpf design-patterns mvvm

我的名字是来自西班牙的Jesús,我是一名.NET开发人员,几天前我刚刚发现了这个伟大的网站。

我对MVVM模式有一些疑问,如果你能回答它我会很高兴 三个月前我开始使用WPF,我已经学会了MVP模式 MVP非常好,因为你可以很好地构建应用程序。

我开始在各处看到MVVM,但每个人都在用他自己的方法使用这个模式 每个博主都在他们的WPF博客中谈论MVVM,但每个实现都是截然不同的。

我现在关注在CodePlex上使用MVVM工具包的实现,但我有疑问,我找不到太多信息。

我认为MVVM是MVP的一种变体 使用MVP,每个视图都有一个执行视图工作的演示者 在MVVM中,它是相同的,但只要你可以使用命令。

我也看到如果你需要一个活动,那就像MVP一样;将事件委托给演示者/视图模型,即如果它不是视图的作业(例如更新UI)。

另一方面,View-Model没有View引用,所以我必须更加努力地使用数据绑定。
您必须使用DelegateCommands(与RelayCommands相同,对吧?)。

嗯...更多问题......使用具有两个视图/用户控件的相同View模型是否安全?

哦......昨天我在玩MVVM时遇到了问题 我为密钥绑定事件创建了CommandReference我的命令,并将此引用分配给了我的按钮的命令属性,嗯,CanExecuted第一次工作但它没有更新{ IsEnabled为真时{1}}属性。我通过将命令直接绑定到按钮而不使用引用来修复它。问题是:为什么有些代码将引用链接到对象以及为什么其他代码直接绑定命令?

我应该学习哪些与MVVM相关的内容? (我昨天看到了一些被称为附加行为的东西,但我不知道那是什么。)

我正在重写我使用MVP开发的注释应用程序,但现在使用MVVM。我将用命令替换事件(使用DelegateCommand),消除View-Model上的视图引用,我认为这都是因为我看到MVVM的例子很像MVP。

好吧,如果你指出我对这种模式的所有误解,我将不胜感激。

谢谢你,将来我会帮助下一个MVVM新手:)

2 个答案:

答案 0 :(得分:12)

哇,我会尝试回答尽可能多的问题,尽可能不涉及特定的技术或框架......对不起,如果我错过了一些(项目符号有帮助)

  • MVVM不一定是MVP的变体。 MVP本身是一个模糊的,加载的术语。马丁福勒通过splitting it into two patterns做到了公正。 MVVM独立存在,但与MVP模式共享一些概念。与所有UI模式一样,它试图尽可能地将视图逻辑与业务逻辑分开。 MVVM所做的与MVP不同的是它创建一个纯粹出于演示目的的模型(或presentation model)。这与MVP模式如何解决分离问题不同。
    • Passive View - 使用被动视图时,视图永远不会看到模型。
    • Supervising Controller - MVVM更接近监督控制器模式而不是被动视图。这里唯一真正的区别可能是MVVM明确地为视图创建了一个模型(因此称为“视图模型”)
  • ViewModel没有对视图的引用,因为它充当视图数据的模型。这是一个合适的抽象。如果它也引用了视图,那么您将具有双向依赖关系,这将产生额外的耦合。此外,ViewModel本身并没有真正的理由去了解View。它唯一的工作是从视图中抽象出模型(实际的商业模式)。
  • DelegateCommands与RelayCommands - 我相信你在这里获得了特定的技术,所以我无法真正回答这个问题。
  • 您不应为多个视图设计ViewModel。这只会创建复杂性,因为如果您更改视图,则必须调查哪些ViewModel可能会受到影响并更改它们。这可能会导致级联效应。您的行为应该在业务模型中,而不是ViewModel,因此ViewModel只需要包含转换和事件处理逻辑。
  • 然而,ViewModel与UserControl的比例为1:1是一个好主意,因为UserControls应该能够作为屏幕上的自治单位。
  • 至于其他技术具体问题,抱歉,我没有答案。不过,我建议您仔细阅读我为Passive ViewSupervising ControllerPresentation Model添加的链接。为UI模式提供了一些上下文,并且是技术中立的。

重要的是要记住,虽然MVVM适合解决采用WPF带来的问题,但它不是特定于技术的模式。如果你在没有理解基础哲学的情况下深入研究具体的实现,你可能会在早期犯下一些非常大的错误,并且只有在为时已晚之后才发现它们。不幸的是,MVVM并不是一个记录良好的模式,当你说每个人都有自己的想法时,你就是对的。

这不是一种革命性的模式(它已经存在多年不同的名称),但WPF的数据绑定现在使其成为一种可行的解决方案,因此它正在享受新的流行。这是一个好的模式,但它不是学说。用适当的怀疑态度来处理你面临的每一个“指令”。

修改

在说明数据绑定是WPF中非常重要的部分时,

@micahtan是正确的。我说WPF的数据绑定支持MVVM解决方案,但绑定本身非常强大,这就是为什么MVVM的采用速度比围绕它的文献更快。

答案 1 :(得分:1)

您实际上不必使用RelayCommand。您真正需要做的就是在对象上实现ICommand接口。在SoapBox Core框架中,我定义了一个名为ICommandControl的接口,所有按钮ViewModels等都实现了它。还有一个AbstractCommandControl类可以派生出来实现它。