WPF ICommand与RoutedCommand

让我们有一个buttonCommand属性绑定到自定义命令。

什么时候应该实现ICommand并从RoutedCommand派生? 我看到RoutedCommand实现了ICommand

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

你已经注意到RoutedCommand类是ICommand接口的一个实现,它的主要区别在于它的function类似于RoutedEvent

RoutedCommand上的Execute和CanExecute方法不包含命令的应用程序逻辑(与典型的ICommand相同),而是这些方法引发遍历元素树的事件,以寻找具有CommandBinding的对象。 连接到CommandBinding的事件处理程序包含命令逻辑。

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

在你不需要RoutedCommand的行为的情况下,你将会看到你自己的ICommand实现。 至于MVVM模式我不能说一个解决scheme,似乎每个人都有自己的方法。 但是,下面是我遇到的这个问题的一些方法:

  • 在WPF中使用带有ViewModel的RoutedCommand
  • 中继命令逻辑
  • 简单的命令 (几乎相同的继电器命令,但值得一读)

Rich McGuire的答案中唯一增加的就是RoutedCommands(以及更为stream行的后代RoutedUICommand必须与事件处理程序连接才能正常工作。

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

相比之下,事件处理程序将这一负担转移到View。 然后处理可以传播到ViewModel,但是这意味着ViewModel和View之间稍微更高的耦合度(投射+方法调用等)。