Что такое CanExecuteChanged?

Можно ли использовать CanExecuteChanged для изменения условия "может выполнить"?

Или иначе... "для чего его использовать?

Ответы

Ответ 1

Нет, вы не можете использовать его для изменения состояния can can. Это событие и объекты, которые участвуют в шаблоне ICommand, могут выбрать прослушивание этого события, например. кнопка может использовать это событие, чтобы узнать, когда нужно повторно запросить состояние команд (путем вызова метода выполнения), чтобы установить его разрешенное состояние.

Для того, чтобы возможность выполнения шаблона могла быть полезной, должно быть что-то, что можно использовать для создания события. Призма DelegateCommand имеет метод, который вы можете вызвать, чтобы вручную поднять это событие, чтобы подписчики повторно запрашивали метод can execute, если они выбрали шаблон.

  • Назначить команду кнопке.
  • Кнопка-подписчик может выполнять измененное событие.
  • Выполнение кнопки может выполнить метод и возвращает кнопку false - отключает.
  • Вы изменяете состояние, которое может выполнять метод, зависит от.
  • Вы можете вызвать команду raise, которая может быть выполнена с помощью команды Prism.
  • Возможно выполнение измененного события.
  • Выполняется обработчик событий кнопки.
  • Команда вызовов кнопок может выполнять кнопку "Метод".

Пример

В следующем примере на основе Prism мы меняем состояние SaveCommand CanExecute от false до true, пока выполняется команда save. Вызов RaiseCanExecuteChanged вызовет событие CanExecuteChanged, и клиенты вызовут метод CanExecute. На практике это приведет к тому, что кнопка "Сохранить", которая была привязана к SaveCommand, изменит свое состояние с включенного на отключенное и снова на включенное.

public class BlingViewModel
{
    private DelegateCommand<object> _saveCommand;
    private bool _canSaveExecute = true;

    public ICommand SaveCommand
    {
        get
        {
            if (_saveCommand == null)
            {
                _saveCommand = new DelegateCommand<object>
                    (
                    executeMethod: _ => Save()
                    ,
                    canExecuteMethod: _ => _canSaveExecute
                    );
            }
            return _saveCommand;
        }
    }

    private void Save()
    {
        _canSaveExecute = false;
        _saveCommand.RaiseCanExecuteChanged();

        Console.WriteLine("Saving...");

        _canSaveExecute = true;
        _saveCommand.RaiseCanExecuteChanged();
    }
}

Ответ 2

Или просто вызовите System.Windows.Input.CommandManager.InvalidateRequerySuggested(), чтобы ваши обработчики CanExecute были переоценены.

Ответ 3

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

Я не знаю, какие последствия для производительности для этого; однако, они не кажутся слишком большими, в любом случае. Это то, что я использую.