Идея в том, что мы устанавливаем CanExecute
нашей команды, чтобы она возвращала, может ли команда выполняться (пример здесь !IsRunning
).
мы знаем, когда изменилась возможность выполнения команды правильно (когда мы буквально устанавливаем IsRunning
на новое значение), поэтому, когда это происходит, мы должны повысить ICommand.CanExecuteChanged
, , потому что это именно то, что только что произошло , способность выполнения команды только что изменилась.
и вот, часть привязки данных Button.Commands - это WPF, подключающий не только предоставляемый нами метод Execute, но и метод CanExecute
, и WPF будет повторно оценивать CanExecute
при поднятии CanExecuteChanged
.
везде, сразу после установки IsRunning
, мы хотели бы поднять _StartCommand.CanExecuteChanged
, вызвав на него Invoke
, что можно сделать только внутри самого RelayCommand
из-за устаревшего правила в C# из The event can only appear on left hand side of += or -=
, поэтому я бы предложил добавить protected void RaiseCanExecuteChanged
в RelayCommand
, чтобы сделать это: CanExecuteChanged?.Invoke(this, EventArgs.Empty)
.