Привязка Silverlight к командам

#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 событие в этом интерфейсе и соответствующим образом включает / отключает элемент управления.