【问题标题】:Why are RelayCommand or DelegateCommand not part of WPF? [closed]为什么 RelayCommand 或 DelegateCommand 不是 WPF 的一部分? [关闭]
【发布时间】:2011-06-24 14:19:00
【问题描述】:

模型-视图-视图模型 (MVVM) 方法似乎是 WPF UI 开发中的领跑者模式。几乎我读过的每一篇文章都暗示这是最佳实践。 RelayCommand 或 DelegateCommand 的使用在许多文章中也很突出,似乎不使用其中任何一个(或任何其他变体)几乎不可能实现 MVVM。那么为什么它们不是 .NET 4 的一部分呢?

我知道 RelayCommand 实现起来非常简单,而且很多第三方工具包已经拥有它,但我只是想知道为什么微软会遗漏一些对于所谓“最佳实践”的实现如此基本和根本的东西?

【问题讨论】:

    标签: .net wpf mvvm relaycommand delegatecommand


    【解决方案1】:

    因为 Microsoft 负责 WPF,而不是 MVVM。

    如果您想要一个完整的工具包,其中包含一个好的 MVVM 应用程序所需的所有组件,我鼓励您看看 Prism:A good tutorial here

    基本原因是微软专注于“主流”WPF 功能(如增强控件和绑定)。如果我没记错的话,MVVM 是由 MVVM 基金会“监督”的。

    【讨论】:

    • 如果你的意思是this,那么这只是一个库,而不是一群试图维护/监督 MVVM 模式的人。
    【解决方案2】:

    与大多数事情一样,它归结为金钱。它可能是一个简单的类,但将它包含在 .NET 中需要大量工作。单个类必须是:

    1. 在发布前经过全面测试。未来版本也必须实施回归测试。
    2. 以多种语言完整记录,还必须经过验证。
    3. 必须对其进行重命名,因为使用 RelayCommand 或 DelegateCommand 很可能会破坏任何已有这些类的 WPF,因为会出现命名冲突。

    其中每一项都需要比您预期的更多的工作(即 #2 将有初稿、修订、最终批准等)。

    找到相关链接here

    【讨论】:

      【解决方案3】:

      我个人对此的看法是 RelayCommands 打破了 MVVM 的意图。

      在我看来,为每个目的实现一个命令比使用 RelayCommands 更“最佳实践”,因为每个类都服务于“单一职责”。命令应将其行为封装在自身中,而不是将其委托给视图模型。

      调试 RelayCommands 不那么直接,而且当您必须逐步完成如此多的函数/动作/委托并从一个对象跳转到另一个对象时,这是一种真正的痛苦。

      【讨论】:

      • 我真的没有看到他们违背了 MVVM 做出的任何承诺。最后,MVVM 都是关于解耦的,例如从视图和它背后的逻辑来看,这些命令完美地实现了这一点。不可否认,SRP 是最重要的原则之一,但您必须注意放置 R 的位置。对我来说,RelayCommand 的职责是提供一种执行某事的方法,即响应事件,我喜欢这样说虚拟机本身中的“某些东西”,因此该命令只有一个依赖关系(虚拟机)。否则,该命令可能依赖于一个或多个引入更紧密耦合的对象。
      • ...但这完全取决于偏离路线的确切情况。我也有很多 RelayCommands 不依赖于 VM,而只是将事件发布到 EventAggregator 左右。在这种情况下,将请求转发给 VM 是很疯狂的。
      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 2013-05-21
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2011-12-13
      • 2013-09-23
      • 2021-02-06
      相关资源
      最近更新 更多