我对命令模式感到困惑。关于这些命令有很多不同的解释。我认为下面的代码是委托命令,但在阅读了有关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; }
}
}
答案 0 :(得分:51)
您的FindProductCommand
类实现了ICommand
接口,这意味着它可以用作WPF command。它既不是DelegateCommand
也不是RelayCommand
,也不是RoutedCommand
,它是ICommand
接口的其他实现。
FindProductCommand
vs DelegateCommand
/ RelayCommand
通常,当ICommand
的实现名为DelegateCommand
或RelayCommand
时,目的是您不必编写实现ICommand
接口的类;相反,您将必要的方法作为参数传递给DelegateCommand
/ RelayCommand
构造函数。
例如,您可以写下:
,而不是整个班级ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
(parameter) => _avm.FindProduct(),
(parameter) => _avm.CanFindProduct()
);
DelegateCommand
/ RelayCommand
的一些实现:
ICommand
called DelegateCommand
DelegateCommand
RelayCommand
相关:
FindProductCommand
vs RoutedCommand
您的FindProductCommand
会在触发后执行FindProduct
。
WPF的内置RoutedCommand
做了其他事情:它引发了一个routed event,可由可视树中的其他对象处理。这意味着您可以将命令绑定附加到其他对象以执行FindProduct
,同时将RoutedCommand
本身专门附加到触发命令的一个或多个对象,例如按钮,菜单项或上下文菜单项。
一些相关的SO答案: