C# ICommand / 中继命令

C# ICommand / RelayCommand

我最近开始学习 WPF(使用 MVVM 模式)。我有一个关于 ICommand 实施的问题...

private ICommand _confirmOptionCommand;

public ICommand ConfirmOptionCommand
{
   get
   {
      if (_confirmOptionCommand == null)
      {
        _confirmOptionCommand = new RelayCommand(ConfirmOptionMethod);
      }
      return _confirmOptionCommand;
   }
}

private void ConfirmOptionMethod() { ... }

但是我可以这样写:

private RelayCommand _confirmOptionCommand;

public RelayCommand ConfirmOptionCommand { ... }

private void ConfirmOptionMethod() { ... }

ICommand有什么优势?或者它们有什么区别?

RelayCommand isICommand,只是一个不同的实现,它允许您在执行命令时调用委托。

当你写ICommand而不是RelayCommand作为变量类型时,你仍然必须指向一个ICommand对象。但是您只能访问 ICommand 界面。如果您想要对象具有的其他方面,则需要派生的 class 引用。在我们的例子中,它是一个 RelayCommand 参考..

下面是 RelayCommand 的样子(不会编译,但你明白了):

public class RelayCommand<T> : ICommand {
    private Action<T> action;

    public RelayCommand(T action){
        this.action = action;
    }

    public bool CanExecute(obj param){
        return true;
    }

    public void Execute(obj param){
        this.action((T)param);
    }

    public CanExecuteEventHandler CanExecuteChanged;

}

还有其他类型的 ICommand,例如与事件处理程序一起使用的 RoutedUICommand

对您的问题最简单的回答是使其松耦合

也就是说,松散耦合的 class(ICommand) 可以独立于其他具体 classes(RelayCommand).

考虑以后是否要将RelayCommand更改为其他委托命令(如DelegateCommand)来调用,在这种情况下需要花费更多的时间和精力来替换所有的消费者你已经使用了具体的 class 参考(RelayCommand)。

在消费时在客户端上使用 ICommand 提供了一种切换到实现 ICommand 的任何具体 class 的方法,而无需对客户端(消费者)进行任何更改。