WPF ICommand vs RoutedCommand

时间:2009-07-16 07:37:01

标签: wpf icommand routedcommand

让我们将按钮Command绑定到自定义命令。

我应该何时实施ICommand以及何时从RoutedCommand派生?我看到 RoutedCommand实现了ICommand

我可以在哪种情况下使用ICommand? 那么MVVM模型呢?哪一个更适合这个目的?

2 个答案:

答案 0 :(得分:66)

正如您已经注意到RoutedCommand classICommand接口的一个实现,如果它的功能类似于RoutedEvent,它的主要区别是:

  

RoutedCommand上的Execute和CanExecute方法不包含命令的应用程序逻辑,就像典型的ICommand一样,但是,这些方法会引发遍历元素树的事件,以查找带有CommandBinding的对象。附加到CommandBinding的事件处理程序包含命令逻辑。

     

Execute方法引发PreviewExecuted和Executed事件。 CanExecute方法引发PreviewCanExecute和CanExecute事件。

如果您不希望RoutedCommand的行为,您将查看自己的ICommand实施。至于MVVM模式,我不能说一个解决方案,似乎每个人都有自己的方法论。但是,我遇到了一些解决这个问题的方法:

答案 1 :(得分:24)

我唯一要补充的是Rich McGuire的答案是RoutedCommands(及其更普遍的后代RoutedUICommand必须与事件处理程序连接才能正常工作。

我遇到的大多数MVVM实现都试图利用对ViewModel的绑定,因此ViewModel(而不是View)拥有CanExecute / Execute逻辑。

相反,事件处理程序将负担转移到View。然后可以将处理传播到ViewModel,但这意味着ViewModel和View(cast +方法调用等)之间的耦合程度略高。