50

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

}
4

1 回答 1

57

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


FindProductCommandDelegateCommand/RelayCommand

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

例如,您可以编写以下代码,而不是整个班级:

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

(另一个可能比节省样板代码更大的好处——如果您在视图模型中实例化DelegateCommand/ RelayCommand,您的命令可以访问该视图模型的内部状态。)

DelegateCommand/的一些实现RelayCommand

有关的:


FindProductCommand对比RoutedCommand

FindProductCommandFindProduct在触发时执行。

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

一些相关的SO答案:

于 2013-01-06T10:27:22.180 回答