首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# ICommand / RelayCommand

C# ICommand / RelayCommand
EN

Stack Overflow用户
提问于 2016-05-01 20:18:59
回答 2查看 1.7K关注 0票数 0

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

代码语言:javascript
复制
private ICommand _confirmOptionCommand;

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

private void ConfirmOptionMethod() { ... }

但我可以这样写:

代码语言:javascript
复制
private RelayCommand _confirmOptionCommand;

public RelayCommand ConfirmOptionCommand { ... }

private void ConfirmOptionMethod() { ... }

ICommand有什么优势?或者他们之间有什么区别?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-01 20:27:57

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

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

下面是一个RelayCommand的样子(不打算编译,但你可以得到):

代码语言:javascript
复制
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,它与事件处理程序一起工作。

票数 0
EN

Stack Overflow用户

发布于 2016-05-02 06:47:36

对于您的问题,最简单的答案是使其成为松散耦合的

可以这样说,松散耦合类(ICommand)可以独立于其他具体类(RelayCommand)来使用和测试。

考虑一下,如果您希望将来将RelayCommand更改为其他委托命令(如DelegateCommand)来调用,那么如果您使用了具体的类引用(RelayCommand),则需要更多的时间和精力来替换所有的使用者。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36971481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档