Delegatecommand,relaycommand和routedcommand之间的区别

时间:2013-01-06 09:00:35

标签: c# mvvm command

我对命令模式感到困惑。关于这些命令有很多不同的解释。我认为下面的代码是委托命令,但在阅读了有关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; }
    }

}

1 个答案:

答案 0 :(得分:51)

您的FindProductCommand类实现了ICommand接口,这意味着它可以用作WPF command。它既不是DelegateCommand也不是RelayCommand,也不是RoutedCommand,它是ICommand接口的其他实现。


FindProductCommand vs DelegateCommand / RelayCommand

通常,当ICommand的实现名为DelegateCommandRelayCommand时,目的是您不必编写实现ICommand接口的类;相反,您将必要的方法作为参数传递给DelegateCommand / RelayCommand构造函数。

例如,您可以写下:

,而不是整个班级
ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
    (parameter) => _avm.FindProduct(),
    (parameter) => _avm.CanFindProduct()
);

DelegateCommand / RelayCommand的一些实现:

相关:


FindProductCommand vs RoutedCommand

您的FindProductCommand会在触发后执行FindProduct

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

一些相关的SO答案:

相关问题