我对MVVM模式有一些疑问

我的名字是来自西class牙的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第一次工作但是当CanExecuted为真时它没有更新IsEnabled属性。 我通过将命令直接绑定到按钮而不使用引用来修复它。 问题是:为什么有些代码将引用链接到对象以及为什么其他代码直接绑定命令?

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

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

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

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

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

  • 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的数据绑定使其成为一种可行的解决方案,因此它正在享受新的流行。 这是一个很好的模式,但它不是学说。 以适当的怀疑态度接近你所面对的每一个“指令”。

编辑

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

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