Что такое CanExecuteChanged для?

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

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

3 ответов


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

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

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

пример

в следующем примере на основе Prism мы меняем состояние SaveCommand CanExecute от false до true во время выполнения команды save. ВызовRaiseCanExecuteChanged вызывает CanExecuteChanged событие, которое будет поднято, и клиенты для вызова CanExecute метод. На практике это сделает кнопку Save это было неизбежно!--7--> измените его состояние с enabled на disabled и обратно на enabled снова.

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();
    }
}

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


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

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