C#ICommand / RelayCommand

时间:2016-05-01 20:19:00

标签: c# wpf mvvm 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有哪些优势?或者它们之间有什么区别?

2 个答案:

答案 0 :(得分:0)

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

当您将ICommand而不是RelayCommand写为变量类型时,您仍然必须指向ICommand对象。但您只能访问ICommand界面。如果您想要对象具有的其他方面,则需要派生类引用。在我们的例子中,它是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,可与事件处理程序配合使用。

答案 1 :(得分:0)

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

说到这一点,松散耦合的类(ICommand)可以独立于其他具体类(RelayCommand)进行消费和测试。

考虑是否要将RelayCommand更改为将来的某个其他委派命令(如DelegateCommand)进行调用,在这种情况下,如果您需要更换所有消费者,则需要花费更多时间和精力使用了具体的类引用(RelayCommand)。

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