【问题标题】:I have some questions about MVVM pattern我对 MVVM 模式有一些疑问
【发布时间】:2009-06-15 18:41:37
【问题描述】:

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

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

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

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

我认为 MVVM 是 MVP 的一种变体。
有了 MVP,每个视图都有一个演示者来完成视图的工作。
在 MVVM 中也是一样的,只是尽可能使用命令。

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

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

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

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

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

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

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

谢谢你,以后我会帮助下一个 MVVM 新手 :)

【问题讨论】:

    标签: c# wpf design-patterns mvvm


    【解决方案1】:

    哇,我将尽可能多地回答你的问题,不涉及特定技术或框架...抱歉,如果我错过了一些(要点会有所帮助)

    • MVVM 不一定是 MVP 的变体。 MVP 本身是一个模棱两可的术语。 Martin Fowler 通过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 是个好主意,因为 UserControl 应该能够充当屏幕上的自治单元。
    • 至于其他技术特定的问题,对不起,我没有答案。不过,我可以建议您仔细阅读我为Passive ViewSupervising ControllerPresentation Model 提供的链接。它们为 UI 模式提供了一些上下文,并且是技术中立的。

    重要的是要记住,虽然 MVVM 适合解决采用 WPF 带来的问题,但它不是一种特定于技术的模式。如果您在不了解基本原理的情况下过于深入地研究特定实现,您可能会在早期犯一些非常大的错误,并且只有在为时已晚时才发现它们。不幸的是,MVVM 不是一个有据可查的模式,当你说每个人都有自己的想法时,你是对的。

    这不是一种革命性的模式(它已经以不同的名称出现多年),但 WPF 的数据绑定使其成为现在可行的解决方案,因此它正受到新的欢迎。这是一个好的模式,但它不是教义。以适当的怀疑态度对待你面临的每一个“命令”。

    编辑

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

    【讨论】:

    • 反响很好。我要补充的唯一重点是不要低估 WPF 中数据绑定的重要性(和普遍性)。以声明方式将 View 绑定到 VM/PM 的简易性是该模式正常工作的原因。
    • 谢谢你,迈克尔。我没有太多要说的。您的回答非常适合非特定问题:) 我会检查这些链接以便更好地理解。另一方面,我需要更多关于与 2 个或更多视图相关联的 ViewModel 的意见。再次感谢。
    • 天哪,关于每个视图 1 个 ViewModel 的事情纯粹是我的看法。根据我的经验,它认为这是明智的。如果重用它们对你有意义,那么你应该(总是做对你有用的事情)。不幸的是,在我看来,关于 UI 模式的好书并不多。体验确实是了解 UI 设计精妙之处的唯一好方法。我希望我有一本好书给你指点,但我还没有找到。对不起。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2014-01-28
      • 2019-06-01
      • 2020-08-14
      相关资源
      最近更新 更多