Каков хороший способ всплывать событиями 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 и обновить его собственный PropertyChanged чем-то вроде Address.City.

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


person Geoff    schedule 14.10.2010    source источник


Ответы (4)


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

person Jackson Pope    schedule 14.10.2010
comment
Я согласен. Мне никогда не приходилось распространять события вверх, когда было привязано поле на уровень или два ниже. Попробуйте запустить PropertyChanged с null в качестве имени свойства и установите точку останова в установщике свойств, чтобы убедиться, что привязка работает (или проверьте окно вывода). - person Andre Luus; 14.10.2010
comment
Это настоящее облегчение, это должно сделать мой код намного лучше. Думаю, я должен был сделать ошибку, когда впервые попробовал это, я просто сделал это снова в новом решении, и он отлично работает. Спасибо за помощь, ребята! - person Geoff; 14.10.2010

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

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

person Ben Gribaudo    schedule 14.10.2010
comment
Бен, ты хотел снова вернуться к этому вопросу? - person Andre Luus; 14.10.2010
comment
Эээ, я думаю, что это неправильная ссылка;) Верно, я, должно быть, что-то упустил. Я думал, что привязки не справятся с этим, вернемся к коду для меня! - person Geoff; 14.10.2010

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

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

person JSprang    schedule 14.10.2010
comment
Да. Так должна ли привязка обрабатывать событие PropertyChanged в PersonModelView или Address, если привязка - {Binding Address.City}? (и PersonModelView, конечно, является DataContext) - person Geoff; 14.10.2010
comment
Не могли бы вы опубликовать свой код? Мне кажется, что то, как вы его настроили, должно работать. Вы смотрели в окно «Вывод», чтобы убедиться, что оно правильно привязано? - person JSprang; 14.10.2010

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

person KolA    schedule 27.05.2014