(的一部分(我的ICommand实现是:
public void RaiseCanExecuteChanged()
{
CommandManager.InvalidateRequerySuggested();
}
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested -= value;
CommandManager.RequerySuggested += value;
}
remove => CommandManager.RequerySuggested -= value;
}
当调用RaiseCanExecuteChanged((时,这在UI中运行良好,但在单元测试中,我想知道UI是否已被通知应该调用CanExecute方法。订阅CanExecuteChanged事件不起作用,因为使用CommandManager时不会触发此事件。有人知道如何测试是否触发了CommandManager.InvalidateRequerySuggested吗?
我也在考虑不使用CommandManager,并将我的实现更改为:
public void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
public event EventHandler CanExecuteChanged;
优点似乎是,这只会触发为特定命令调用CanExecute,而不是为在CommandManager中注册的所有命令调用CanExecute。有人能确认我对指挥官的理解是正确的吗?有人知道"正常"CanExecuteChanged事件的这种方法的缺点吗?
就我个人而言,我更喜欢使用需要显式调用CanExecuteChanged的ICommand实现-我使用MVVM Light RelayCommand。当你依赖CommandManager时,你永远不知道CanExecuteChanged何时会被调用——可能是在每次按键或鼠标点击之后,这可能会变得非常低效。
对于我自己对WPF命令的理解,特别是在其他属性上创建自动CanExecuteChanged依赖项,请查看我最近的博客文章。