Для чего нужен CanExecuteChanged? - PullRequest
16 голосов
/ 25 декабря 2010

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

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

Ответы [ 3 ]

22 голосов
/ 25 декабря 2010

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

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

  • Назначить команду кнопке.
  • Кнопка подписки может выполнять измененное событие.
  • Кнопка execute может выполнять метод и возвращает false - отключает кнопку.
  • Вы можете изменить состояние, от которого может выполняться метод.
  • Вы вызываете рейз, может выполнить измененную команду 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();
    }
}
7 голосов
/ 26 мая 2011

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

2 голосов
/ 29 октября 2015
public override event EventHandler CanExecuteChanged
{    
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

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

...