我最近开始学习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
有哪些优势?或者它们之间有什么区别?
答案 0 :(得分:0)
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
,可与事件处理程序配合使用。
答案 1 :(得分:0)
对您的问题的最简单回答是松散耦合
说到这一点,松散耦合的类(ICommand
)可以独立于其他具体类(RelayCommand
)进行消费和测试。
考虑是否要将RelayCommand
更改为将来的某个其他委派命令(如DelegateCommand
)进行调用,在这种情况下,如果您需要更换所有消费者,则需要花费更多时间和精力使用了具体的类引用(RelayCommand
)。
在使用时在客户端上使用ICommand
提供了一种切换到任何实现ICommand
的具体类的方法,而不会在客户端(消费者)中进行任何更改。