DelegateCommand、RelayCommand和RoutedCommand的区别

52

我对命令模式感到困惑。关于命令的解释很多。我之前认为下面的代码是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; }
    }

}

你是否已经进行了谷歌搜索?在这里查看示例,尝试代码并将其应用到你手头的项目中。 http://msdn.microsoft.com/en-us/library/ff654132.aspx http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.mvvm.relaycommand.aspx http://msdn.microsoft.com/en-us/library/system.windows.input.routedcommand.aspx - MethodMan
2
是的,它并没有太大帮助。 - Zaz
我建议在谷歌上搜索命令模式,然后... - MethodMan
11
我已经完成了,这就是为什么我对我发布的代码产生怀疑,它是DelegateCommand还是RelayCommand?有很多不同的解释。 - Zaz
1个回答

58

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


FindProductCommandDelegateCommand/RelayCommand

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

例如,您可以只编写以下代码而非整个类:

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

(除了节省样板代码之外,将DelegateCommand / RelayCommand实例化到您的视图模型中可能比这更有益,因为您的命令可以访问该视图模型的内部状态。)

DelegateCommand / RelayCommand的一些实现:

相关:


FindProductCommandRoutedCommand

当触发时,您的FindProductCommand将执行FindProduct

WPF内置的RoutedCommand则会引发路由事件,可以由视觉树中的其他对象处理。这意味着您可以将命令绑定附加到那些其他对象上,以执行FindProduct,同时将RoutedCommand本身特别附加到一个或多个触发命令的对象上,例如按钮、菜单项或上下文菜单项。

一些相关的SO答案:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接