0

Надеюсь, кто-то может помочь мне с этим. Я создаю приложение Silverlight, которое используется для редактирования изображений. У пользователя есть проект, который содержит слои, содержащие элементы. (Элементы представляют собой элементы текста и изображения).Связывание данных Silverlight с коллекцией в коллекции

У меня есть класс, который представляет проект. Он содержит ObservableCollection<Layer>, и каждый слой имеет ObservableCollection<Element>. Элемент - абстрактный класс. Существует класс TextElement и ImageElement, который наследует от Element.

Моя проблема заключается в том, что пользовательский интерфейс никогда не обновляется при изменении элемента внутри коллекции. Я использую INotifyPropertyChanged для всех своих свойств, и я собираю CollectionChanged в коллекциях, но все равно не хожу. Событие CollectionChanged для ObservableCollection<Element> никогда не попадает в обновление одного из его элементов.

Это код, который я первоначально имел:

void Elements_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { this.NotifyChange("Elements"); }

Если кто-нибудь может помочь я был бы очень благодарен.

ответ

0

ObservableCollection<> публикует CollectionChanged, когда элементы добавляются или удаляются, но это НЕ делает это, когда элемент внутри коллекции изменяется.

Для того, чтобы обойти эту проблему, вы можете подписаться на CollectionChanged события, а затем подписаться на INotifyPropertyChanged добавленных элементов внутри CollectionChanged обработчика:

elementCollection.CollectionChanged += (s, a) => 
{ 
    foreach (Element element in a.NewItems) 
     element.PropertyChanged += ElementChanged; 
}; 

Затем вы можете обновить пользовательский интерфейс в рамках метода ElementChanged.

+0

Спасибо за ваш совет, но проблема в том, что событие elementCollection.CollectionChanged никогда не срабатывает. Свойства элементов обновляются, но коллекция, содержащая Элементы, не работает. – Matthew

+0

CollectionChanged не будет запущен, когда свойства элементов будут изменены, но будет _will_ fire, когда элементы будут добавлены в коллекцию. Таким образом, используя вышеприведенный код, вы уже подписались на элемент PropertyChanged из элемента, когда он был добавлен в коллекцию, - и позже, когда свойство этого элемента изменится, CollectionChanged не будет срабатывать, но PropertyChanged элемента будет срабатывать и Будет запущен метод ElementChanged. –

+0

Я не уверен, что понимаю. Я реализовал код выше, но он работает только при добавлении элемента. Есть ли способ, которым я могу обновить пользовательский интерфейс, поскольку я изменяю свойство, например. Element.Name? – Matthew

Смежные вопросы