0

(部分)我的 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 注册的所有命令。有人可以确认我对 CommandManager 的理解是正确的吗?有谁知道这种“正常” CanExecuteChanged 事件的方法的缺点?

4

1 回答 1

0

我个人更喜欢使用需要显式调用 CanExecuteChanged 的​​ ICommand 实现 - 我使用MVVM Light RelayCommand。当您依赖 CommandManager 时,您永远不知道 CanExecuteChanged 何时会被调用 - 可能在每次击键或鼠标单击之后会变得非常低效。

对于我自己对 WPF 命令的看法,尤其是在其他属性上创建自动化的 CanExecuteChanged 依赖项,请查看我最近的博客文章

于 2018-11-29T11:54:45.007 回答