52

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

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

在什么情况下我需要实现一个ICommand?MVVM模型呢?哪一个更适合这个目的?

4

2 回答 2

69

正如您所注意到的,RoutedCommand该类ICommand接口的实现,其主要区别在于其功能类似于 a 的功能RoutedEvent

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

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

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

于 2009-07-16T12:34:28.803 回答
28

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

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

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

于 2009-07-16T12:49:28.933 回答