让我们将按钮Command
属性绑定到自定义命令。
我应该何时实施ICommand
以及何时派生RoutedCommand
?我看到RoutedCommand 实现了 ICommand。
在什么情况下我需要实现一个ICommand
?MVVM模型呢?哪一个更适合这个目的?
让我们将按钮Command
属性绑定到自定义命令。
我应该何时实施ICommand
以及何时派生RoutedCommand
?我看到RoutedCommand 实现了 ICommand。
在什么情况下我需要实现一个ICommand
?MVVM模型呢?哪一个更适合这个目的?
正如您所注意到的,RoutedCommand
该类是ICommand
接口的实现,其主要区别在于其功能类似于 a 的功能RoutedEvent
:
RoutedCommand 上的 Execute 和 CanExecute 方法不像典型的 ICommand 那样包含命令的应用程序逻辑,而是这些方法引发遍历元素树以查找具有 CommandBinding 的对象的事件。附加到 CommandBinding 的事件处理程序包含命令逻辑。
Execute 方法引发 PreviewExecuted 和 Executed 事件。CanExecute 方法引发 PreviewCanExecute 和 CanExecute 事件。
如果您不RoutedCommand
希望ICommand
. 至于 MVVM 模式我不能说是一种解决方案,似乎每个人都有自己的方法论。但是,这里有一些我遇到的解决这个问题的方法:
我要添加到 Rich McGuire 的答案中的唯一一件事是 RoutedCommands(及其更普遍的后代RoutedUICommand必须与事件处理程序连接起来才能正常工作。
我遇到的大多数 MVVM 实现都试图利用对 ViewModel 的绑定,因此 ViewModel(而不是 View)拥有 CanExecute/Execute 逻辑。
相反,事件处理程序将这个负担转移到视图。然后可以将处理传播到 ViewModel,但这意味着 ViewModel 和 View 之间的耦合程度稍高(强制转换 + 方法调用等)。