MVVM模式有关的一些问题

3

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

我有一些关于MVVM模式的问题,如果您能回答它们,我会很高兴。
我三个月前开始使用WPF,并学习了MVP模式。
MVP非常好,因为它可以很好地构建应用程序。

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

我现在专注于使用MVVM工具包的实现,但我有问题,找不到太多信息。

我认为MVVM是MVP的变体。
对于MVP,每个视图都有一个执行视图工作的Presenter。
在MVVM中,也是这样,但尽可能使用命令。

我还发现,如果需要事件,就像在MVP中一样,将事件委托给Presenter / View-Model,这样做不是视图的工作(例如更新UI)。

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

嗯...还有更多问题...使用同一个View-Model在两个视图/用户控件中是否安全?

哦...昨天我在玩MVVM时遇到了一个问题。
我为键绑定事情创建了一个CommandReference,并将此引用分配给我的按钮的命令属性,好吧,CanExecuted第一次起作用,但当CanExecuted为true时它没有更新IsEnabled属性。我通过直接将命令绑定到按钮而不是使用引用来解决了这个问题。问题是:为什么有些代码将引用链接到对象,而其他代码直接绑定命令?

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

我正在重写一个笔记应用程序,我使用MVP开发了它,但现在使用MVVM。我将使用DelegateCommand将事件替换为命令,消除View-Model上的视图引用,我认为这就是全部,因为我看到的MVVM示例非常像MVP。

好的,如果您能指出我对这种模式的所有误解,我会很感激。

谢谢,在未来我也会帮助下一个MVVM新手 :)

2个回答

12

哇,我会尽可能回答你的问题,只要不涉及具体的技术或框架... 如果我漏掉了一些问题,请见谅(项目符号会有所帮助)

  • MVVM不一定是MVP的变体。 MVP本身就是一个模糊、有负面含义的术语。马丁·福勒通过将其分成两个模式,对此进行了合理的解释。MVVM是独立的,但与MVP模式共享某些概念。像所有UI模式一样,它尽可能地将视图逻辑与业务逻辑分离。 MVVM与MVP不同之处在于,它创建了一个纯粹用于演示(或演示模型)的模型。这与MVP模式解决分离问题的方式不同。
    • 被动视图 - 在被动视图中,视图从未看到模型。
    • 监控控制器 - MVVM更接近于监控控制器模式,而不是被动视图。唯一的真正区别可能在于MVVM明确为视图创建了一个模型(因此称为“视图模型”)
  • ViewModel没有对视图的引用,因为它作为视图数据的模型。这是一个适当的抽象。如果它还引用了视图,您将拥有双向依赖关系,这会创建额外的耦合。此外,ViewModel本身没有真正的理由知道View。它的唯一工作是将模型(实际业务模型)从视图中抽象出来。
  • DelegateCommands vs. RelayCommands - 我认为您在这里涉及到了技术细节,所以我无法很好地回答这个问题。
  • 您不应该为多个视图设计一个ViewModel。这只会在更改视图时增加复杂性,因为您将不得不调查可能受影响的ViewModel,并更改这些内容。这可能导致级联效应。您的行为应该在业务模型中,而不是在ViewModel中,因此ViewModel只需要包含翻译和事件处理逻辑。
  • 然而,最好将ViewModel与UserControl保持1:1的比例,因为UserControl应该能够在屏幕上作为自主单元运行。
  • 至于其他技术特定的问题,抱歉,我没有答案。但我建议您仔细阅读我提供的被动视图监控控制器演示模型链接。它们提供了UI模式的上下文,并且是技术中立的。
重要的是要记住,虽然MVVM适用于解决采用WPF时出现的问题,但它并不是一种特定于技术的模式。如果你在不理解其基本哲学的情况下深入研究某个具体实现,可能会在早期犯下一些非常严重的错误,并且只有在为时已晚之后才会发现。不幸的是,MVVM不是一个文档完备的模式,正如你所说,每个人对它的理解都有所不同。
它不是一种革命性的模式(多年来以不同的名称存在),但WPF的数据绑定使它成为现在可行的解决方案,因此它正在享受新的流行。这是一种好的模式,但它并非教条。对于你面临的每一个“规定”,都要适当地持怀疑态度。
编辑: @micahtan 在指出数据绑定是WPF中非常重要的一部分时是正确的。我曾经说过,WPF的数据绑定使MVVM成为可能,但数据绑定本身非常强大,这就是为什么MVVM的采用速度比围绕它的文献增长更快的原因。

非常不错的回答。我想强调的是,在WPF中不要低估数据绑定的重要性和普遍性。声明性地将视图与视图模型/属性模型绑定所带来的便利性,使得这种模式变得更加有效。 - micahtan
谢谢你,Michael。我没有太多要说的。你的回答对于非特定问题非常好 :)我会查看那些链接以获得更好的理解。另一方面,我需要更多关于将ViewModel链接到2个或更多视图的意见。再次感谢。 - Jesus Rodriguez
Jesús,关于每个视图一个ViewModel的事情纯属我的个人意见。根据我的经验,我认为这是明智的选择。如果您觉得重用它们有意义,那么您应该这样做(始终做适合自己的事情)。不幸的是,在我看来,UI模式方面没有太多好的阅读材料。经验确实是了解UI设计微妙之处的唯一好方法。我希望我能找到一本好书给你,但我仍然没有找到。抱歉。 - Michael Meadows

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接