我对MVVM模式有一些疑问

Jes*_*uez 3 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当它CanExecuted为真时它没有更新属性.我通过将命令直接绑定到按钮而不使用引用来修复它.问题是:为什么有些代码将引用链接到对象以及为什么其他代码直接绑定命令?

我应该学习哪些与MVVM有关的东西?(昨天我看到一些叫做附加行为的东西,但我不知道那是什么).

我正在重写我使用MVP开发的注释应用程序,但现在使用MVVM.我将替换命令的事件(使用DelegateCommand),消除对视图模型的参考意见,我认为这都是因为,我看到MVVM的例子是很像MVP.

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

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

Mic*_*ows 12

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

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

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

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

编辑

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