#silverlight #binding #command
#silverlight #привязка #команда
Вопрос:
Иногда, когда я привязываю команды к ViewModel, мой код CanExecute не всегда вызывается, и, следовательно, мои кнопки не отключаются, когда они должны быть.
Есть идеи?
Спасибо
Ответ №1:
Когда CanExecute вызывается не в первый раз, это проблема привязки.
Если он не вызывается «автоматически» во второй, [n]-й раз, это нормальное поведение.
Представьте, как пользовательский интерфейс должен знать, что он должен запрашивать ваш предикат? Когда у вас есть параметр command, он будет вызывать ваш предикат при каждом изменении параметра. Как правило, некоторые «события» пользовательского интерфейса также запрашивают его (focus, updatelayout и т. Д.), Но не всегда (это хорошо, было бы бессмысленно постоянно пересматривать привязку каждой команды). Поэтому вы не можете полагаться на это. Вы создаете бизнес-логику, поэтому знаете, когда ей требуется обновление, а не пользовательский интерфейс. Пользовательский интерфейс «не может видеть внутри вашего делегата предиката» и смотреть, что происходит. Вы должны уведомить об этом пользовательский интерфейс так же, как вы уведомляете об изменении свойства.
У ICommand есть событие, поэтому вы должны его реализовать, это CanExecuteChanged .
Вы должны реализовать общедоступный метод для его запуска (или он уже реализован, если вы используете фреймворк, такой как MVVMLight или Prism).
Простая реализация.
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
Таким образом, вы можете вызывать его в своей команде всякий раз, когда ваше состояние CanExecute изменяется в вашей бизнес-логике, и оно будет уведомлять всех подписчиков, что в данном случае является вашей кнопкой.
Ответ №2:
Вы упоминаете, что состояние кнопки не отключено. Это больше похоже на проблему привязки, чем на привязку к командам. Изменяется ли состояние свойства, к которому вы привязываетесь? Когда это меняется и т.д.?
Комментарии:
1. Кнопка ни к чему не привязывается, только к ее свойству Command
2. @Jared Peless: если элемент управления реализует ICommand, он обычно прослушивает
CanExecute
событие в этом интерфейсе и соответствующим образом включает / отключает элемент управления.