Raise CanExecuteChanged при изменении модели
В моем ViewModel
у меня есть ObservableCollection
из Person
объекты (которые реализуют INotifyPropertyChanged
) и SelectedPerson
имущество. Они связаны с ListBox, на мой взгляд.
В моей ViewModel также есть следующая Prism DelegateCommand:
Private DelegateCommand _myCommand = New DelegateCommand(CanExecute)
Public DelegateCommand MyCommand {get {return _myCommand;}}
Private Bool CanExecute()
{
Return (SelectedPerson.Age > 40);
}
Какой самый элегантный способ вызова MyCommand.RaiseCanExecuteChanged всякий раз, когда SelectedPerson
меняется и всякий раз, когда SelectedPerson
возраст меняется?
Добавление и удаление обработчиков измененных свойств в SelectedPerson
Сеттер кажется мне немного грязным.
1 ответ
Добавление и удаление обработчиков измененных свойств в установщике SelectedPerson кажется мне немного беспорядочным.
Вот как я это делаю, и я не уверен, что будет более чистой альтернативой. Если состояние команды зависит от подчиненного свойства, вам нужно как-то наблюдать за изменениями. Будьте осторожны с отказом от подписки, иначе вы рискуете утечкой памяти, если ваш Person
переживает вашу точку зрения модели. PropertyChangedEventManager
и слабые обработчики событий могут помочь, если вы не можете гарантировать, что отмените подписку.
Чтобы держать вещи в чистоте, у меня обычно есть только один обработчик, который прослушивает любые изменения под-свойств, который вызывает RequeryCommands
метод (также вызывается непосредственно методами модели представления), который в свою очередь вызывает RaiseCanExecuteChanged
для всех команд на мой взгляд.