Для чего нужен CanExecuteChanged?
Могу ли я использовать CanExecuteChanged для изменения условия "можно выполнить"?
Или еще... "для чего" его использовали?
4 ответа
Нет, вы не можете использовать его для изменения состояния выполнения. Это событие и объекты, которые участвуют в ICommand
шаблон может выбрать прослушивание этого события, например, кнопка может использовать это событие, чтобы узнать, когда повторно запрашивать состояние команд (вызывая метод can execute), чтобы установить его включенное состояние.
Для того чтобы шаблон can execute был полезен, должно быть что-то, что можно использовать для вызова события. призмы DelegateCommand
есть метод, который вы можете вызвать, чтобы вручную вызвать это событие, чтобы подписчики повторно запросили метод can execute, если они выбрали шаблон.
- Назначить команду на кнопку.
- Кнопка подписки на может выполнить измененное событие.
- Кнопка execute может выполнить метод, и он возвращает false - отключает кнопку.
- Вы можете изменить состояние, от которого может выполняться метод, зависит от.
- Вы вызываете рейз может выполнить изменено по команде Призма.
- Может выполнить измененное событие.
- Обработчик событий кнопки срабатывает.
- Команда вызова кнопок может выполнять метод - кнопка включена.
пример
В следующем примере, основанном на Prism, мы меняем состояние SaveCommand CanExecute
от false до true, пока выполняется команда сохранения. Призыв к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; }
}
Я не знаю, как это повлияет на производительность; однако, они не кажутся слишком большими, так или иначе. Это то, что я использую.
Это старый вопрос, но ответы на него непростые для новичка в WPF, поэтому я добавляю свой ответ здесь.
- это событие, которое означает, что состояние CanExecute ICommand было изменено. Он используется для уведомления пользовательского интерфейса об изменении состояния "только чтение" некоторого пользовательского элемента управления. Он не используется для изменения состояния CanExecute.
Вы можете проверить документацию по призме для дальнейшего чтения, она очень удобна для пользователя и имеет видео, чтобы показать демонстрацию того, как использовать
CanExecuteChanged
мероприятие. https://prismlibrary.com/docs/commanding.html