Модульное тестирование ICommand.CanExecute при использовании CommandManager - PullRequest
0 голосов
/ 29 ноября 2018

(часть) моя реализация ICommand:

    public void RaiseCanExecuteChanged()
    {
        CommandManager.InvalidateRequerySuggested();
    }

    public event EventHandler CanExecuteChanged
    {
        add
        {
            CommandManager.RequerySuggested -= value;
            CommandManager.RequerySuggested += value;
        }
        remove => CommandManager.RequerySuggested -= value;
    }

Это прекрасно работает в пользовательском интерфейсе при вызове RaiseCanExecuteChanged (), но в модульном тесте я хочу узнать, был ли пользовательский интерфейс уведомлен о том, что ондолжен вызвать метод CanExecute.Подписка на событие CanExecuteChanged не работает, поскольку это событие не вызывается, поскольку вместо него используется CommandManager.Кто-нибудь знает, как проверить, был ли запущен CommandManager.InvalidateRequerySuggested?

Я также рассматриваю возможность не использовать CommandManager и изменить мою реализацию на:

    public void RaiseCanExecuteChanged()
    {
        CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    }

    public event EventHandler CanExecuteChanged;

преимущество заключается в том, что этотолько триггеры, вызывающие CanExecute для конкретной команды, а не для всех команд, зарегистрированных в CommandManager.Может кто-нибудь подтвердить, что мое понимание о CommandManager верно?Кто-нибудь знает недостатки этого подхода с «нормальным» событием CanExecuteChanged?

1 Ответ

0 голосов
/ 29 ноября 2018

Лично я предпочитаю использовать реализацию ICommand, которая требует явного вызова CanExecuteChanged - я использую MVVM Light RelayCommand .Когда вы полагаетесь на CommandManager, вы никогда не знаете, когда будет вызываться CanExecuteChanged - возможно, после каждого нажатия клавиши или щелчка мыши, что может стать очень неэффективным.

Для моего собственного взгляда на команды WPF, особенно при создании автоматических зависимостей CanExecuteChanged длядругие свойства, посмотрите на мое недавнее сообщение в блоге .

...