Delegatecommand,relaycommand和routedcommand之间的区别

我对命令模式感到困惑。 关于命令有很多不同的解释。 我认为下面的代码是delegatecommand,但在阅读了关于relaycommand后,我有疑问。

relaycommand,delegatecommand和routedcommand有什么区别。 是否有可能在与我的发布代码有关的例子中显示?

class FindProductCommand : ICommand { ProductViewModel _avm; public FindProductCommand(ProductViewModel avm) { _avm = avm; } public bool CanExecute(object parameter) { return _avm.CanFindProduct(); } public void Execute(object parameter) { _avm.FindProduct(); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } } 

您的FindProductCommand类实现了ICommand接口,这意味着它可以用作WPF 命令 。 它既不是一个DelegateCommand ,也不是一个RelayCommand ,也不是一个RoutedCommand ,它是ICommand接口的其他实现。


RelayCommand vs DelegateCommand / RelayCommand

通常,当ICommand的实现名为DelegateCommandRelayCommand ,意图是不必编写实现ICommand接口的类; 而是将必要的方法作为parameter passing给DelegateCommand / RelayCommand构造函数。

例如,而不是你的整个class级,你可以写:

 ProductViewModel _avm; var FindPoductCommand = new DelegateCommand<object>( (parameter) => _avm.FindProduct(), (parameter) => _avm.CanFindProduct() ); 

DelegateCommand / RelayCommand一些实现:

  • Microsoft Prism DelegateCommand参考
  • ICommand WPF教程实现调用了DelegateCommand
  • 另一个实现也叫做DelegateCommand
  • RelayCommand Josh Smith的原始执行

有关:

  • 中继/ ICommand与DelegateCommand – 差异

RoutedCommandRoutedCommand

触发后,您的FindProductCommand将执行FindProduct

WPF的内置RoutedCommand做了其他的事情:它引发了一个路由事件 ,可以由可视树中的其他对象处理。 这意味着您可以附加绑定到其他对象的命令来执行RoutedCommand ,同时将RoutedCommand本身专门附加到一个或多个触发命令的对象,例如button,菜单项或上下文菜单项。

一些相关的答案如下:

  • MVVM路由和中继命令
  • WPF ICommand与RoutedCommand