我对命令模式感到困惑。关于命令有很多不同的解释。我以为下面的代码是委托(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)的其他实现。

FindProductCommandDelegateCommand/RelayCommand

通常,当将ICommand的实现命名为DelegateCommandRelayCommand时,其目的是不必编写实现ICommand接口(interface)的类。而是将必要的方法作为参数传递给DelegateCommand/RelayCommand构造函数。

例如,您可以编写以下内容来代替整个类(class):

ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
    parameter => _avm.FindProduct(),
    parameter => _avm.CanFindProduct()
);

(另一个可能比节省样板代码更大的好处-如果您在 View 模型中实例化DelegateCommand/RelayCommand,则您的命令可以访问该 View 模型的内部状态。)
DelegateCommand/RelayCommand的一些实现:
  • Microsoft Prism DelegateCommand reference
  • WPF Tutorial implementation of ICommand called DelegateCommand
  • Another implementation也称为DelegateCommand
  • Josh Smith的original implementation of RelayCommand

  • 有关的:
  • Relay/ICommand vs DelegateCommand -- Differences


  • FindProductCommandRoutedCommand

    触发时,您的FindProductCommand将执行FindProduct

    WPF的内置 RoutedCommand 可以做其他事情:它会产生一个routed event,可以由可视树中的其他对象来处理。这意味着您可以将绑定(bind)到其他对象的命令附加到执行FindProduct,同时将RoutedCommand本身专门附加到一个或多个触发命令的对象,例如按钮,菜单项或上下文菜单项。

    一些相关的答案:
  • MVVM Routed and Relay Command
  • WPF ICommand vs RoutedCommand
  • 10-08 13:05