The ICommand
界面如下:
public interface ICommand
{
// two methods
bool CanExecute(object parameter);
void Execute(object parameter);
// one event
event EventHandler CanExecuteChanged;
}
The CanExecuteChanged
任何时候您想要表明该事件时都应该引发该事件CanExecute
方法应由 WPF 检查/调用。谁实施谁ICommand
应该引发该事件,并且任何需要刷新 GUI(WPF 系统)上按钮启用状态的人都应该注册并处理该事件,并且它调用CanExecute
.
在约什史密斯的RelayCommand
类,他使用WPF的内置CommandManager
提高班级CanExecuteChanged
:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
本质上,WPF 的CommandManager
是一个监听各种路由事件的单例:KeyUpEvent、MouseUpEvent 等...然后通过提高其值来告诉每个人“嘿,发生了一些有趣的事情”RequerySuggested
事件。所以如果你正在使用RelayCommand
, your CanExecute
每次都会被叫CommandManager
认为 GUI 上发生了一些有趣的事情(即使它与您的收藏无关)。如果您有 50 个命令,则每次您键入时,它都会重新检查所有 50 个命令。所以是的,这个could是一个性能问题。然而,如果你的逻辑CanExecute
方法很简单,可能不是问题。要点:不要在CanExecute
method.
搭便车的替代方案CommandManager.RequerySuggested
提高ICommand.CanExecuteChanged
活动是推出您自己的版本RelayCommand
你自己检查并加注的地方CanExecuteChanged
手动,或者查看 Prism 框架的DelegateCommand
类,他们不参与其中CommandManager
并且你必须手动提高CanExecuteChanged
事件,您可以通过创建监听器来完成PropertyChanged
然后提高CanExecuteChanged
在命令上。
不过我同意上面@Will 的观点。RelayCommand
80% 以上的时间可能都可以正常工作,不会出现任何问题。如果您确实开始发现性能问题,那么您可以创建自己的 RelayCommand 版本或使用 PrismDelegateCommand
并提高CanExecuteChanged
手动。