(我的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;
优点似乎是,这仅触发针对特定命令而不是针对在CommandManager中注册的所有命令的调用CanExecute。有人可以确认我对CommandManager的理解是正确的吗?有人知道“正常” CanExecuteChanged事件对这种方法的不利之处吗?
答案 0 :(得分:0)
我个人更喜欢使用ICommand实现,该实现要求显式调用CanExecuteChanged-我使用MVVM Light RelayCommand。当您依靠CommandManager时,您永远都不知道何时会调用CanExecuteChanged-可能是在每次击键或单击鼠标后,效率都非常低下。
对于WPF命令,尤其是在其他属性上自动创建CanExecuteChanged依赖项,请看一下我最近的blog post。