让我们将按钮Command
绑定到自定义命令。
我应该何时实施ICommand
以及何时从RoutedCommand
派生?我看到 RoutedCommand实现了ICommand 。
我可以在哪种情况下使用ICommand
?
那么MVVM模型呢?哪一个更适合这个目的?
答案 0 :(得分:66)
正如您已经注意到RoutedCommand
class是ICommand
接口的一个实现,如果它的功能类似于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 +方法调用等)之间的耦合程度略高。