INotifyPropertyChanged или INotifyCollectionChanged с DataTable?
Привет у меня возникли проблемы с DataTables. Так что мне нужно обнаружить, когда я изменяю любую ячейку в DataGrid DataTable, которая связана.
Как это сделать? С INotifyPropertyChanged
или с INotifyCollectionChanged
?
Примечание: я пытаюсь с INotifyPropertyChanged
но он обнаруживает только когда я устанавливаю какое-то значение в DataTable, и никогда, когда я изменяю какое-либо значение любой ячейки в DataGrid, я уже пытался OneWay
а также TwoWay
но ничего не происходит
Заранее спасибо!
2 ответа
Сетка данных будет привязана к списку объектов. Если вы хотите, чтобы сетка обновлялась при изменении свойств отдельных объектов, то каждый содержащийся объект должен реализовывать INotifyPropertyChanged
интерфейс.
INotifyCollectionChanged
является интерфейсом, который должна реализовывать коллекция, и предназначена для уведомлений о событиях добавления и удаления.
См. Раздел "Как реализовать коллекции" на этой странице.
Вот способ подойти к вашей проблеме:
- Создайте новый класс, который предоставляет свойства, которые в настоящее время содержатся в каждом
DataRow
, На этом классе реализуемINotifyPropertyChanged
, - Вместо
DataTable
используйтеObservableCollection<T>
или ваш новый класс.
ObservableCollection
уже реализует INotifyCollectionChanged
Таким образом, это экономит ваши усилия по реализации этого самостоятельно.
Ответ на заголовок вашего вопроса: Ни то, ни другое. На самом деле вам не нужно привязывать DataTable к DataGrid. Вы привязываете DataView. "ADO.NET DataView реализует интерфейс IBindingList, который предоставляет уведомления об изменениях, которые отслеживает механизм привязки". (Обзор источников привязки) Один из ответов на ваш вопрос: вы изменяете ячейку таблицы данных с помощью TextBox (обычно). Сделайте это с новым текстовым полем, унаследованным от TextBox, и переопределите его методы OnGotFocus и OnLostFocus.
Если вы установили источник данных вашей таблицы данных в datatable, то wpf создаст IBindingListView, который связан с сетью данных.
Теперь вы можете редактировать, добавлять и удалять элементы в вашей таблице данных через сетку данных. если вы хотите знать, когда ячейка в вашей таблице данных изменяется, вы можете подписаться на событие DataTable.ColumnChanged.
почему вы хотите знать, когда ячейка меняется?