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
is
和 ICommand
,只是一个不同的实现,它允许您在执行命令时调用委托。
当你写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 的方法,而无需对客户端(消费者)进行任何更改。
我最近开始学习 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
is
和 ICommand
,只是一个不同的实现,它允许您在执行命令时调用委托。
当你写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 的方法,而无需对客户端(消费者)进行任何更改。