Проблема такая: необходимо изменять значения в коллекции при изменении хотя бы одного из полей в объекте. Если ближе к самой идеи кода, то при изменении длины одного из участков трубы, нужно пересчитать другие.
Архитектура в коде такая: родительский абстрактный класс public abstract class AbstractTube, от которого наследуется класс public class TubingStage : AbstractTube, и создается лист из труб
public class CollectionTubingStage: ObservableCollection < TubingStage > ,
INotifyPropertyChanged {}
//Есть обработчик события и само событие в классе TubingStage:
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info) {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
// И код свойства в том же классе
public override double Lenght {
get {
return TLenght;
}
set {
TLenght = value;
NeedAutoAlign = true;
NotifyPropertyChanged("Lenght of stage has been changed!");
}
}
Как мне правильно воспользоваться INotifyPropertyChanged для этого? Не понятно как из экземпляра коллекции получить доступ к самой коллекции, для ее модификации.
Ответ
Не-не, это не дело элемента коллекции, менять саму коллекцию. Делайте так: Участок трубы реализует INotifyPropertyChanged Класс Tube содержит приватно коллекцию участков. Он же занимается добавлением и удалением этих самых участков. ObservableCollection вообще не нужен, труба знает, когда в ней добавляются/уходят куски. При добавлении куска труба подписывается на его PropertyChanged, при удалении отписывается На PropertyChanged нужно пересчитать общую длину. Так же как и на добавлении и удалении куска. Если сильно хочется, можно закешировать длины кусков, чтобы не опрашивать их повторно при изменении лишь одного куска. А можно и не делать, оптимизация не особо большая, больше мороки, чем пользы.
Комментариев нет:
Отправить комментарий