Wpf INotifyPropertyChanged或INotifyCollectionChanged与DataTable?

Wpf INotifyPropertyChanged或INotifyCollectionChanged与DataTable?,wpf,binding,inotifypropertychanged,inotifycollectionchanged,Wpf,Binding,Inotifypropertychanged,Inotifycollectionchanged,嗨,我有一些麻烦与数据表。因此,我需要的是,每当我更改绑定的DataTable的DataGrid中的任何单元格时,都要进行检测 怎么做?更改了INotifyPropertyChanged还是更改了inotifycollection 注意:我正在尝试使用INotifyPropertyChanged,但它仅在我在DataTable中设置某个值时检测,并且在我更改DataGrid中任何单元格的任何值时从不检测,我已经尝试了单向和双向,但什么都没有发生 提前谢谢 数据网格将绑定到一个对象列表。如果希望网

嗨,我有一些麻烦与数据表。因此,我需要的是,每当我更改绑定的DataTable的DataGrid中的任何单元格时,都要进行检测

怎么做?更改了
INotifyPropertyChanged
还是更改了
inotifycollection

注意:我正在尝试使用
INotifyPropertyChanged
,但它仅在我在DataTable中设置某个值时检测,并且在我更改DataGrid中任何单元格的任何值时从不检测,我已经尝试了
单向
双向
,但什么都没有发生


提前谢谢

数据网格将绑定到一个对象列表。如果希望网格在单个对象属性更改时更新,则包含的每个对象都必须实现
INotifyPropertyChanged
接口

INotifyCollectionChanged
是集合应实现的接口,用于通知添加和删除事件

请参阅上的“如何实现集合”一节


以下是解决问题的方法:

  • 创建一个新类,该类公开每个
    数据行中当前保存的属性。在此类上实现INotifyPropertyChanged
  • 不要使用
    数据表
    ,而是使用
    可观察集合
    或新类

ObservableCollection
已经实现了
INotifyCollectionChanged
,因此这节省了您自己实现它的工作量。

如果您将datagrid的itemssource设置为datatable,则wpf将创建一个绑定到datagrid的IBindingListView

您现在可以通过datagrid编辑、添加和删除数据表中的项。如果想知道datatable中的单元格何时更改,可以订阅datatable.ColumnChanged事件


为什么要知道单元格何时更改?

问题标题的答案是:两者都不更改。实际上,您不需要将DataTable绑定到DataGrid。您可以绑定一个数据视图。“ADO.NET DataView实现IBindingList接口,该接口提供绑定引擎侦听的更改通知。”(绑定源概述) 你的问题的一个答案是:
您可以使用文本框(通常)修改datagrid单元格。使用从textbox继承的新textbox执行此操作,并覆盖其OnGotFocus和OnLostFocus方法。

因此,如果我理解正确,我必须将数据表转换为IEnumarable,对吗?然后,当插入或删除某些内容时,我必须实现集合通知。但是,如果没有使用INotifyCollectionChanged的真实示例,这是很困难的。我已经了解了如何使用INotifyPropertyChanged,但是对于集合,我还没有找到任何好的例子。@Miguel-我已经添加了一个额外的段落来回答您的问题。我不知道为什么有人反对我,但我只想在这个答案上添加一些东西。无需创建observablecollection。我在我的项目中使用datagrid和itemssource到datatable,我可以添加、修改、删除内容,进行验证和筛选,而无需包装我的datatable。顺便说一句,我仍然不知道为什么米格尔想知道什么时候任何细胞被改变。有一个HasChanges属性可以告诉您何时有更改。如果您以编程方式修改datatable中的单元格,那么您的更改是否会自动反映在datagrid显示中?