使用INotifyPropertyChanged或INotifyCollectionChanged与DataTable?

5
嗨,我在使用DataTables时遇到了一些问题。我需要检测每当我更改绑定的DataTable中DataGrid中的任何单元格时。如何做到呢?使用INotifyPropertyChanged还是INotifyCollectionChanged?请注意:我尝试使用INotifyPropertyChanged但它只能检测到当我在DataTable中设置某个值时,并且从未在DataGrid中更改任何单元格的值,我已经尝试过OneWay和TwoWay但什么也没发生。谢谢!
3个回答

12
数据网格将绑定到对象列表。如果您希望当单个对象属性更改时网格更新,则每个包含的对象都必须实现INotifyPropertyChanged接口。 INotifyCollectionChanged是应该实现的集合接口,用于通知添加和删除事件。
请参阅“如何实现集合”部分,位于此页面上。
以下是解决问题的方法:
1. 创建一个新类,公开当前每个DataRow中保存的属性。在此类中实现INotifyPropertyChanged接口。 2. 使用ObservableCollection<T>或您的新类,而不是使用DataTableObservableCollection已经实现了INotifyCollectionChanged,因此这可以节省您自己实现的工作量。

所以如果我理解正确,我需要将我的DataTable转换为IEnumarable,对吗?然后我将不得不在插入或删除某些内容时实现集合通知。但是没有使用INotifyCollectionChanged的真实示例是很困难的。我已经了解如何使用INotifyPropertyChanged,但是对于集合,我还没有找到任何好的示例。 - Miguel
@Miguel - 我已经添加了一个额外的段落来回答你的疑虑。 - Andrew Shepherd
1
不知道为什么有人给我踩了,但我会为这个答案添加一些内容。没有必要创建一个ObservableCollection。在我的项目中,我使用DataGrid和ItemsSource将DataTable应用到所有地方,我可以添加、修改、删除内容,进行验证和过滤,而且所有这些都无需包装我的DataTable。顺便说一句,我还不知道为什么Miguel想知道任何单元格何时更改。有一个HasChanges属性,它会告诉你何时有变化。 - blindmeis

0

如果您将DataGrid的ItemSource设置为DataTable,则WPF会创建一个绑定到DataGrid的IBindingListView。

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

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


如果您以编程方式修改数据表中的单元格,那么这种更改是否会自动反映在数据网格显示中? - Andrew Shepherd

0
你问题标题的答案是:两者都不需要。实际上,你不需要将 DataTable 绑定到 DataGrid 上,你需要绑定 DataView。“ADO.NET 的 DataView 实现了 IBindingList 接口,提供绑定引擎所监听的更改通知”(Binding Sources Overview)。 对于你的问题,一个解决方法是:使用 TextBox 修改 DataGrid 单元格(通常情况下)。可以通过创建继承自 TextBox 的新文本框并重写其 OnGotFocus 和 OnLostFocus 方法进行实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接