C# Delegatecommand、relaycommand和routedcommand之间的差异

C# Delegatecommand、relaycommand和routedcommand之间的差异,c#,mvvm,command,C#,Mvvm,Command,我对命令模式感到困惑。关于这些命令有很多不同的解释。我原以为下面的代码是delegatecommand,但在阅读了relaycommand之后,我对此表示怀疑 relaycommand、delegatecommand和routedcommand之间的区别是什么。是否可以在示例中显示与我发布的代码相关的内容 class FindProductCommand : ICommand { ProductViewModel _avm; public FindProductCommand(

我对命令模式感到困惑。关于这些命令有很多不同的解释。我原以为下面的代码是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
类实现了该接口,这意味着它可以用作。它既不是
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()
);
ProductViewModel\u avm;
var findProductCommand=新的DelegateCommand(
参数=>\u avm.FindProduct(),
参数=>\u avm.CanFindProduct()
);
(另一个可能比样板代码的节省更大的好处是——如果在viewmodel中实例化
DelegateCommand
/
RelayCommand
,则命令可以访问该viewmodel的内部状态。)

DelegateCommand
/
RelayCommand
的一些实现:

  • 也称为
    DelegateCommand
  • 乔希·史密斯的作品
相关的:


FindProductCommand
vs
RoutedCommand


触发后,
FindProduct命令
将执行
FindProduct

WPF的内置功能还有其他作用:它会引发一个可由可视化树中的其他对象处理的问题。这意味着您可以将命令绑定附加到这些其他对象以执行
FindProduct
,同时将
RoutedCommand
本身专门附加到触发该命令的一个或多个对象,例如按钮、菜单项或上下文菜单项

一些相关的答案:


你做过谷歌搜索吗。。看看这里的例子,试着把代码应用到你所拥有的东西上。。是的,它没有帮助,所以muchI会建议在google上的命令模式上进行google搜索then@DJKRAZE:我已经完成了,这就是为什么我对我发布的代码有疑问,是delegatecommand还是relaycommand?有许多不同的解释。