#c_sharp
Проблема такая: необходимо изменять значения в коллекции при изменении хотя бы одного из полей в объекте. Если ближе к самой идеи кода, то при изменении длины одного из участков трубы, нужно пересчитать другие. Архитектура в коде такая: родительский абстрактный класс 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 для этого? Не понятно как из экземпляра коллекции получить доступ к самой коллекции, для ее модификации.
Ответы
Ответ 1
Не-не, это не дело элемента коллекции, менять саму коллекцию. Делайте так: Участок трубы реализует INotifyPropertyChanged Класс Tube содержит приватно коллекцию участков. Он же занимается добавлением и удалением этих самых участков. ObservableCollection вообще не нужен, труба знает, когда в ней добавляются/уходят куски. При добавлении куска труба подписывается на его PropertyChanged, при удалении отписывается На PropertyChanged нужно пересчитать общую длину. Так же как и на добавлении и удалении куска. Если сильно хочется, можно закешировать длины кусков, чтобы не опрашивать их повторно при изменении лишь одного куска. А можно и не делать, оптимизация не особо большая, больше мороки, чем пользы.
Комментариев нет:
Отправить комментарий