Wpf 为什么支持RelayCommand而不是RoutedCommand?

Wpf 为什么支持RelayCommand而不是RoutedCommand?,wpf,mvvm,Wpf,Mvvm,我试图学习MVVM软件设计模式。我有马修·麦克唐纳的书《C#2010中的职业WPF》来帮助我更好地学习WPF。在开始学习MVVM的过程中,我看了WindowsClient.net网站,特别是Todd Miranda的视频“我如何:使用MVVM模式构建数据驱动的WPF应用程序”。在本文中,他简要讨论了RoutedCommand,但基于ICommand接口编写了自己的一个名为RelayCommand的类的实现。这看起来很有希望,但我遇到了一个问题,我正在开发的窗口(一个带有文本框的简单窗口,以及使用

我试图学习MVVM软件设计模式。我有马修·麦克唐纳的书《C#2010中的职业WPF》来帮助我更好地学习WPF。在开始学习MVVM的过程中,我看了WindowsClient.net网站,特别是Todd Miranda的视频“我如何:使用MVVM模式构建数据驱动的WPF应用程序”。在本文中,他简要讨论了RoutedCommand,但基于ICommand接口编写了自己的一个名为RelayCommand的类的实现。这看起来很有希望,但我遇到了一个问题,我正在开发的窗口(一个带有文本框的简单窗口,以及使用用户输入的参数进行搜索并在列表框中返回结果的按钮)比Todd所做的更复杂。基本上,我找不到一种方法来获取用户在我编写的RelayCommand类中输入的搜索参数,该类返回一个我调用AllClient(显示在列表框中)的ObservableCollection。MacDonald的书讨论了RoutedCommand,尤其是RoutedCommand,坦率地说,这看起来对我正在尝试做的事情很有希望。然而,为了更好地理解MVVM模式,我又快速查看了哪些书籍可以帮助您在Amazon上学习MVVM模式,并找到了Gary Hall的《Pro WPF和Silverlight MVVM》等书籍。在那本书中,霍尔似乎强烈地暗示,RoutedCommand路线不是一条可行之路。这是有问题的,因此最好使用RelayCommand


坦白说,我真的很困惑。首先,我完全不理解霍尔的论点。为什么使用RoutedCommands(或者可能也使用RoutedICommands)是如此糟糕的替代方案?为什么使用relayCommand如此优越?

一般来说,我发现
RoutedCommand
通常都过大。这是一个很好的解释,它的力量

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


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

可能重复非常感谢您提供指向WPF ICommand vs RoutedCommand的链接。这很有帮助。那么,在我看来,RoutedCommand或RoutedUICommand在某些情况下可能有其用途,而使用RelayCommand之类的东西在其他情况下也可能有其用途。正如第二个回答您链接的问题的人所建议的,使用RoutedCommand更多地依赖于视图中的事件。因此,可能需要一些代码。因此,这取决于视图中需要多少代码。