Как DataGrid уведомляется об изменении элемента в коллекции?

#wpf #data-binding #datagrid #observablecollection

Вопрос:

У меня есть две сетки данных, привязанные к одному и тому же свойству ObservableCollection в моей модели представления. Когда я редактирую существующую строку в одной сетке данных, другая обновляется после ввода строки.

Но как это работает? Событие NotifyCollectionChanged не возникает в базовой коллекции ObservableCollection. Я проверил это, подписавшись на мероприятие.

Ответ №1:

В этом случае вы изменяете свойства элемента (сущности) коллекции, а не саму коллекцию.
Поэтому событие CollectionChanged не вызывается.
Чтобы обновить свойства в сущности, в ней необходимо реализовать INotifyPropertyChanged.
Но если изменение свойств происходит ТОЛЬКО через привязки, то даже в этом нет необходимости.
Привязки используют в своей работе описатель свойств и другие типы отражения.
Это позволяет привязкам «знать», что свойство было изменено другой привязкой.

Если вы говорите по-русски, прочтите мою статью: https://www.cyberforum.ru/wpf-silverlight/thread2650880.html

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

1. И в каждой книге говорится, что переплет работает через INotifyPropertyChanged. Я разочарован тем, как много вещей работают не так, как описано в документах.

2. «привязка работает через INotifyPropertyChanged» — это немного другое. Правильно «привязка с использованием INotifyPropertyChanged». Это один из механизмов, используемых привязками, но не единственный. Существует множество сложностей в том, как работают привязки. Вы помните: для пути к свойству им просто нужно указать строковое значение. И поэтому невозможно получить стоимость недвижимости без размышлений.