Страницы

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

пятница, 5 июля 2019 г.

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

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

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

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