ICommand vs RoutedCommand

问题描述 投票:49回答:2

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

[我何时应实现ICommand,何时应从RoutedCommand派生?我看到RoutedCommand实现ICommand

在哪种情况下,我需要实现ICommand?MVVM模型呢?哪个更适合此目的?

wpf mvvm icommand routed-commands
2个回答
68
投票

您已经注意到RoutedCommand classRoutedCommand接口的实现,如果它的功能类似于ICommand的功能,则其主要区别是:

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

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

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


27
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.