Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Как правильно использовать INotifyPropertyChanged для извещения “родителя” о изменение экземпляра?

#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 нужно пересчитать общую длину. Так же как и на добавлении и удалении куска. Если сильно хочется, можно закешировать длины кусков, чтобы не опрашивать их повторно при изменении лишь одного куска. А можно и не делать, оптимизация не особо большая, больше мороки, чем пользы.

Комментариев нет:

Отправить комментарий