我最近开始学习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有什么优势?或者他们之间有什么区别?
发布于 2016-05-01 20:27:57
RelayCommand is是一个ICommand,只是一个不同的实现,它允许您在执行命令时调用委托。
当您将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,它与事件处理程序一起工作。
发布于 2016-05-02 06:47:36
对于您的问题,最简单的答案是使其成为松散耦合的。
可以这样说,松散耦合类(ICommand)可以独立于其他具体类(RelayCommand)来使用和测试。
考虑一下,如果您希望将来将RelayCommand更改为其他委托命令(如DelegateCommand)来调用,那么如果您使用了具体的类引用(RelayCommand),则需要更多的时间和精力来替换所有的使用者。
在客户端使用ICommand时,同时使用它提供了一种切换到实现ICommand的任何具体类的方法,而客户端(消费者)中没有任何更改。
https://stackoverflow.com/questions/36971481
复制相似问题