, так как я не смог найти готовое к использованию решение, я сделал пользовательскую реализацию на основе предложений Питера (и Маркса) (спасибо!).
Используя классы, выбудут уведомлены о любых изменениях в глубоком дереве объектов, это работает для любых INotifyPropertyChanged
реализующих типов и INotifyCollectionChanged
* реализующих коллекций (очевидно, я использую ObservableCollection
для этого).
IНадеюсь, это оказалось довольно чистым и элегантным решением, хотя оно не полностью протестировано и есть возможности для улучшений.Его довольно просто использовать, просто создайте экземпляр ChangeListener
, используя его статический метод Create
, и передайте INotifyPropertyChanged
:
var listener = ChangeListener.Create(myViewModel);
listener.PropertyChanged +=
new PropertyChangedEventHandler(listener_PropertyChanged);
PropertyChangedEventArgs
, обеспечивающий PropertyName
, который всегда будетполный «путь» ваших объектов.Например, если вы измените «BestFriend» имя вашего персонажа, PropertyName
будет «BestFriend.Name», если BestFriend
имеет коллекцию дочерних элементов, а вы изменили его возраст, значение будет «BestFriend.Children []. Возраст "и так далее.Не забудьте Dispose
когда ваш объект уничтожен, тогда он (будем надеяться) полностью отписывается от всех слушателей событий.
Он компилируется в .NET (протестировано в 4) и Silverlight (протестировано в 4),Поскольку код разделен на три класса, я разместил код в gist 705450 , где вы можете получить все это: https://gist.github.com/705450 **
*) Одна из причин того, что код работает, заключается в том, что ObservableCollection
также реализует INotifyPropertyChanged
, иначе он не будет работать должным образом, это известное предостережение
**) Используйте бесплатно, выпущенопод Лицензия MIT