为什么喜欢RelayCommand而不是RoutedCommand?

时间:2011-10-23 04:42:15

标签: wpf mvvm

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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