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 для всех команд на мой взгляд.

Другие вопросы по тегам