我对命令模式感到困惑。关于命令有很多不同的解释。我以为下面的代码是委托(delegate)命令,但是在阅读了中继命令之后,我对此表示怀疑。
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
接口(interface),这意味着它可用作WPF command。它既不是DelegateCommand
也不是RelayCommand
,也不是RoutedCommand
,它们是ICommand
接口(interface)的其他实现。
FindProductCommand
与DelegateCommand
/RelayCommand
通常,当将ICommand
的实现命名为DelegateCommand
或RelayCommand
时,其目的是不必编写实现ICommand
接口(interface)的类。而是将必要的方法作为参数传递给DelegateCommand
/RelayCommand
构造函数。
例如,您可以编写以下内容来代替整个类(class):
ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
parameter => _avm.FindProduct(),
parameter => _avm.CanFindProduct()
);
(另一个可能比节省样板代码更大的好处-如果您在 View 模型中实例化
DelegateCommand
/RelayCommand
,则您的命令可以访问该 View 模型的内部状态。)DelegateCommand
/RelayCommand
的一些实现:ICommand
called DelegateCommand
DelegateCommand
RelayCommand
有关的:
FindProductCommand
与RoutedCommand
触发时,您的
FindProductCommand
将执行FindProduct
。WPF的内置
RoutedCommand
可以做其他事情:它会产生一个routed event,可以由可视树中的其他对象来处理。这意味着您可以将绑定(bind)到其他对象的命令附加到执行FindProduct
,同时将RoutedCommand
本身专门附加到一个或多个触发命令的对象,例如按钮,菜单项或上下文菜单项。一些相关的答案: