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
的实现名为DelegateCommand
或RelayCommand
,意图是不必编写实现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 – 差异
RoutedCommand
与RoutedCommand
触发后,您的FindProductCommand
将执行FindProduct
。
WPF的内置RoutedCommand
做了其他的事情:它引发了一个路由事件 ,可以由可视树中的其他对象处理。 这意味着您可以附加绑定到其他对象的命令来执行RoutedCommand
,同时将RoutedCommand
本身专门附加到一个或多个触发命令的对象,例如button,菜单项或上下文菜单项。
一些相关的答案如下:
- MVVM路由和中继命令
- WPF ICommand与RoutedCommand