使用DataTable进行INotifyPropertyChanged或INotifyCollectionChanged?

时间:2011-04-27 03:14:37

标签: wpf binding inotifypropertychanged inotifycollectionchanged

嗨,我在使用DataTables时遇到了麻烦。所以我需要的是检测每当我更改绑定的DataTable的DataGrid中的任何单元格时。

怎么做?使用INotifyPropertyChangedINotifyCollectionChanged

注意:我正在尝试使用INotifyPropertyChanged,但它只检测我何时在DataTable中设置了一些值,而且当我更改DataGrid中任何单元格的任何值时,我从未尝试过OneWayTwoWay但没有任何反应。

提前致谢!

3 个答案:

答案 0 :(得分:9)

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

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

请参阅this page上的“如何实施馆藏”部分。

<小时/> 这是解决问题的方法:

  • 创建一个新类,公开当前在每个DataRow中保存的属性。在此类工具上INotifyPropertyChanged
  • 使用DataTable或您的新课程,而不是ObservableCollection<T>

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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