C# Delegatecommand、relaycommand和routedcommand之间的差异
我对命令模式感到困惑。关于这些命令有很多不同的解释。我原以为下面的代码是delegatecommand,但在阅读了relaycommand之后,我对此表示怀疑 relaycommand、delegatecommand和routedcommand之间的区别是什么。是否可以在示例中显示与我发布的代码相关的内容C# Delegatecommand、relaycommand和routedcommand之间的差异,c#,mvvm,command,C#,Mvvm,Command,我对命令模式感到困惑。关于这些命令有很多不同的解释。我原以为下面的代码是delegatecommand,但在阅读了relaycommand之后,我对此表示怀疑 relaycommand、delegatecommand和routedcommand之间的区别是什么。是否可以在示例中显示与我发布的代码相关的内容 class FindProductCommand : ICommand { ProductViewModel _avm; public FindProductCommand(
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
类实现了该接口,这意味着它可以用作。它既不是DelegateCommand
也不是RelayCommand
,也不是RoutedCommand
,后者是ICommand
接口的其他实现
FindProductCommand
vsDelegateCommand
/RelayCommand
通常,当ICommand
的实现命名为DelegateCommand
或RelayCommand
时,目的是不必编写实现ICommand
接口的类;而是将必要的方法作为参数传递给DelegateCommand
/RelayCommand
构造函数
例如,您可以编写以下内容,而不是整个类:
ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
parameter => _avm.FindProduct(),
parameter => _avm.CanFindProduct()
);
ProductViewModel\u avm;
var findProductCommand=新的DelegateCommand(
参数=>\u avm.FindProduct(),
参数=>\u avm.CanFindProduct()
);
(另一个可能比样板代码的节省更大的好处是——如果在viewmodel中实例化DelegateCommand
/RelayCommand
,则命令可以访问该viewmodel的内部状态。)
DelegateCommand
/RelayCommand
的一些实现:
- 也称为
DelegateCommand
- 乔希·史密斯的作品
FindProductCommand
vsRoutedCommand
触发后,
FindProduct命令
将执行FindProduct
WPF的内置功能还有其他作用:它会引发一个可由可视化树中的其他对象处理的问题。这意味着您可以将命令绑定附加到这些其他对象以执行FindProduct
,同时将RoutedCommand
本身专门附加到触发该命令的一个或多个对象,例如按钮、菜单项或上下文菜单项
一些相关的答案: