Коллекция наблюдаемых коллекций изменена - PullRequest
4 голосов
/ 01 декабря 2011

Очень быстро на наблюдаемых коллекциях. Я играл с ними в Silverlight, занимаясь какими-то обязательными вещами. Похоже, событие CollectionChanged срабатывает при удалении или добавлении в коллекцию. Я хотел бы, чтобы что-то сработало, когда я изменяю свойство одного из классов внутри коллекции. Само свойство коллекции уже имеет RaisePropertyChanged. Нужно ли делать что-то особенное для самого класса типов? Так что, если у меня есть это:

ObservabelCollection<Person> personcollection... and if I change a property like:

Person p = personcollection.where(e => e.FirstName == "Joey").FirstOrDefault();
if (p != null) { p.FirstName = "Joe"; }

Я бы ожидал, что что-то случится в интерфейсе, но ничего не изменится.

Любая помощь будет принята с благодарностью.

David

Ответы [ 4 ]

2 голосов
/ 01 декабря 2011

Я вижу, что вы пытаетесь сделать, но если я прав, Observable Collection вызывает только событие INotifyCollectionChanged, когда элементы в его коллекции изменяются.Это вызовет изменения в пользовательском интерфейсе.

Не имеет значения, изменяется ли свойство одного из его объектов в его коллекции.Вам нужно будет реализовать интерфейс INotifyPropertyChanged в свойствах этих объектов, чтобы вызвать изменение пользовательского интерфейса.

Я прочитал здесь , что дало мне некоторую полезную информацию.Хотя он предназначен для WPF, большая часть его все еще применяется, поскольку Silverlight по существу является подмножеством WPF.

2 голосов
/ 01 декабря 2011

Чтобы получить обновления для Person класса, вы должны реализовать INotifyPropertyChanged для них.

0 голосов
/ 01 декабря 2011

ObservableCollection не сообщает об изменениях, внесенных в свойства объектов в коллекции.

Чтобы получить такое поведение, вам нужно подключить событие INotifyPropertyChanged.PropertyChanged для каждого дочернего объекта, когда он вставляется в вашу коллекцию. Вы можете сделать это в событии CollectionChanged коллекции. Не забудьте отсоединить события, когда дети удаляются из коллекции.

0 голосов
/ 01 декабря 2011

INotifyCollectionChanged должен уведомлять кого-либо об изменении коллекции.

INotifyPropertyChanged должен уведомлять кого-либо об изменении свойства объекта.

Объект класса должен реализовывать интерфейс и должен правильно запускать события. Так что, если вы связываете его через объект Binding, пользовательский интерфейс может обновить себя.

ObservableCollection правильно реализует INotifyCollectionChanged , но не имеет никакого отношения к содержащимся в нем объектам. Потому что если свойство объекта изменилось , это не событие CollectionChanged . Это событие PropertyChanged конкретного объекта в коллекции. Поэтому вы должны реализовать интерфейс INotifyPropertyChanged в своем классе Person.

...