Можно ли использовать CanExecuteChanged для изменения условия "может выполнить"?
Или иначе... "для чего его использовать?
Можно ли использовать CanExecuteChanged для изменения условия "может выполнить"?
Или иначе... "для чего его использовать?
Нет, вы не можете использовать его для изменения состояния can can. Это событие и объекты, которые участвуют в шаблоне ICommand
, могут выбрать прослушивание этого события, например. кнопка может использовать это событие, чтобы узнать, когда нужно повторно запросить состояние команд (путем вызова метода выполнения), чтобы установить его разрешенное состояние.
Для того, чтобы возможность выполнения шаблона могла быть полезной, должно быть что-то, что можно использовать для создания события. Призма DelegateCommand
имеет метод, который вы можете вызвать, чтобы вручную поднять это событие, чтобы подписчики повторно запрашивали метод can execute, если они выбрали шаблон.
Пример
В следующем примере на основе 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();
}
}
Или просто вызовите System.Windows.Input.CommandManager.InvalidateRequerySuggested()
, чтобы ваши обработчики CanExecute
были переоценены.
public override event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
Я не знаю, какие последствия для производительности для этого; однако, они не кажутся слишком большими, в любом случае. Это то, что я использую.