Что такое хороший способ пузырить события INotifyPropertyChanged с помощью свойств ViewModel с MVVM?

Я пытаюсь найти лучший способ пузырить события PropertyChanged из вложенных свойств в моем ModelView. Скажем, у меня есть ModelView PersonModelView, у которого есть свойство PersonModelView.Address. Address в свою очередь имеет свойство City. Когда я привязываюсь к City, на мой взгляд, я бы сделал что-то вроде {Binding Address.City}.

Моя проблема в том, что даже если Address реализует INotifyPropertyChanged, привязка не будет обновляться, поскольку она обрабатывает PropertyChanged на PersonModelView, а не Address. Я думаю, у меня есть два варианта: (1) изменить источник привязки (или изменить DataContext) на свойство Address или (2) иметь PersonModelView дескриптор PropertyChanged объекта Address и refire свой собственный PropertyChanged с чем-то вроде Address.City.

Как вы, ребята, решаете это? (Я использую MVVM light toolkit в mo, но меня интересуют любые подходы)

Ответы

Ответ 1

Если Address реализует INotifyPropertyChanged и правильно создает события PropertyChanged в свойстве City, тогда привязка должна заметить, что свойство, с которым оно связано, изменилось.

Ответ 2

Здесь существует поток SO, содержащий решение о том, как создавать пузырьки этих уведомлений: Когда свойства вложенности, реализующие INotifyPropertyChanged, должны быть изменены прототип родительского объекта?

Тем не менее, IIRC WPF имеет возможность автоматически отслеживать адрес для уведомлений INotifyPropertyChanged, когда привязка элемента управления установлена ​​на Address.City без PersonViewModel, которая должна повторно транслировать уведомления об обновлении объектов адреса.

Ответ 3

Создает ли ваш объект Address INotifyPropertyChanged? Если нет, я думаю, что это исправит проблему, которую вы видите.

Edit: Извините, только что заметил, что вы упомянули в своем посте, что вы уже это пробовали. Вы пытались подписаться на событие PropertyChanged объекта Address в PersonViewModel? OnChanged, вы можете выполнить PropertyChanged в объекте Address.

Ответ 4

Отметьте PropertyChangedPropagator, он может обрабатывать зависимости от свойств вложенных моделей представлений, включая динамически изменяемые вложенные модели представления: http://www.codeproject.com/Articles/775831/INotifyPropertyChanged-propagator