【问题标题】:Why favor RelayCommand over RoutedCommand?为什么偏爱 RelayCommand 而不是 RoutedCommand?
【发布时间】:2011-12-13 10:39:52
【问题描述】:

我正在尝试学习 MVVM 软件设计模式。我有 Matthew MacDonald 的书“C# 2010 中的 Pro WPF”来帮助我更好地学习 WPF。在尝试开始学习 MVVM 时,我查看了 WindowsClient.net 网站,尤其是 Todd Miranda 的视频“我如何:使用 MVVM 模式构建数据驱动的 WPF 应用程序”。他在其中简要讨论了 RoutedCommand,但编写了自己的基于 ICommand 接口的 RelayCommand 类的实现。这看起来很有希望,但是我遇到了一个问题,因为我正在开发的窗口(一个带有文本框的简单窗口,以及使用用户输入的参数进行搜索并在列表框中返回结果的按钮)比托德做了什么。基本上,我找不到一种方法来获取用户在我编写的 RelayCommand 类中输入的搜索参数,该类返回一个我称为 AllClients 的 ObservableCollection(显示在列表框中)。 MacDonald 的书讨论了 RoutedCommand,尤其是 RoutedUICommand,坦率地说,这看起来对我正在尝试做的事情充满希望。然而,为了更好地理解 MVVM 模式,我快速浏览了 Amazon 上可以帮助学习 MVVM 模式的书籍,并找到了一些书籍,例如 Gary Hall 的“Pro WPF 和 Silverlight MVVM”。在那本书中,霍尔似乎强烈建议 RoutedCommand 路线不是要走的路。这是有问题的,因此最好使用 RelayCommand。

好吧,坦率地说,我真的很困惑。首先,我根本不理解霍尔的论点。为什么使用 RoutedCommands(或者可能是 RoutedUICommands)是一个糟糕的选择?为什么使用 RelayCommands 如此优越?

【问题讨论】:

标签: wpf mvvm


【解决方案1】:

一般来说,我发现RoutedCommand 经常过大。在WPF ICommand vs RoutedCommand 中有一个很好的解释它的力量。

我认为RelayCommand 的优越性在于它的易用性和直接性。它仅在视图模型中使用Execute 和可选的CanExecute 事件处理程序进行实例化。在我只想将一些功能连接到按钮、菜单项等的情况下,这一直很好。

如果您需要传递命令的任何参数,我建议将它们放在您的视图模型中,在命令实现所在的位置旁边。例如,对于搜索命令,您将有一个文本框绑定到包含搜索文本的视图模型中的字符串属性。当您的命令的 Execute 事件处理程序被调用时,它将获取该属性的值并将其传递给您在模型中实现的搜索例程。因此,我认为不需要使用命令的 Parameters 属性。视图模型方法更加灵活,允许使用多个参数。

【讨论】:

  • 非常感谢您提供指向 WPF ICommand 与 RoutedCommand 的链接。这有帮助。在我看来,RoutedCommand 或 RoutedUICommand 在某些情况下可能有其用途,而使用 RelayCommand 之类的东西可能在其他情况下有其用途。作为第二个回答您建议的问题的人,使用 RoutedCommand 更多地依赖于视图中的事件。因此那里可能需要一些代码。因此,这取决于您在视图中需要多少代码。
猜你喜欢
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2011-11-24
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多