Подписаться на INotifyPropertyChanged для вложенных (дочерних) объектов
Я ищу чистый иэлегантный решение для обработкиINotifyPropertyChanged
событие вложенных (дочерних) объектов. Пример кода:
public class Person : INotifyPropertyChanged {
private string _firstName;
private int _age;
private Person _bestFriend;
public string FirstName {
get { return _firstName; }
set {
// Short implementation for simplicity reasons
_firstName = value;
RaisePropertyChanged("FirstName");
}
}
public int Age {
get { return _age; }
set {
// Short implementation for simplicity reasons
_age = value;
RaisePropertyChanged("Age");
}
}
public Person BestFriend {
get { return _bestFriend; }
set {
// - Unsubscribe from _bestFriend's INotifyPropertyChanged Event
// if not null
_bestFriend = value;
RaisePropertyChanged("BestFriend");
// - Subscribe to _bestFriend's INotifyPropertyChanged Event if not null
// - When _bestFriend's INotifyPropertyChanged Event is fired, i'd like
// to have the RaisePropertyChanged("BestFriend") method invoked
// - Also, I guess some kind of *weak* event handler is required
// if a Person instance i beeing destroyed
}
}
// **INotifyPropertyChanged implementation**
// Implementation of RaisePropertyChanged method
}
Сосредоточиться наBestFriend
Свойство и его значение. СейчасЯ знаю, что я мог бы сделать это вручную, реализуя все шаги, описанные в комментариях. Но это будет много кода, особенно когда я планирую реализовать много дочерних свойствINotifyPropertyChanged
как это. Конечно, они не всегда будут одного типа, единственное, что у них общегоINotifyPropertyChanged
интерфейс.
Причина в том, что в моем реальном сценарии у меня есть сложный объект «Товар» (в корзине), который имеет свойства вложенного объекта в нескольких слоях (у предмета есть объект «Лицензия», который сам может снова иметь дочерние объекты), и я Нужно получать уведомления о любых единичных изменениях «Предмета», чтобы можно было пересчитать цену.
Есть ли у вас хорошие советы или даже некоторые реализации, которые помогут мне решить эту проблему?
К сожалению, я не могу / не могу использовать шаги после сборки, такие как PostSharp, для достижения моей цели.
Заранее большое спасибо,
Томас