【发布时间】:2011-03-02 20:06:47
【问题描述】:
在我目前正在进行的项目中,我没有普通的 CLR 对象来绑定我的数据网格。通常,我会使用 ObservableCollection<MyObject>,但现在我不能,而是必须使用自定义对象(其行为类似于 DataTable,但具有自定义逻辑)。
我的问题是:如何制作一个代理/适配器对象,它将我的数据网格单元格中项目的每个绑定操作“转换”为我的自定义逻辑对象?
记住:
- 我的对象不是集合,所以我没有真正的项目。
- 虚拟物品的“列”可能会改变。
- 在应用程序的某个地方,我可能会更改该对象中的一个值,并且数据网格必须反映更改
现在我们正在从自定义对象重新创建一个 DataTable 以让他的 DataView 显示在数据网格中,我们拦截带有事件的编辑命令(这很丑陋),然后每次更改单元格值时从头开始重新加载所有内容。
我搜索了有关如何完成此操作的提示,但我发现的是:
- IItemProperties 接口(拥有动态列可能会很有趣,但我没有集合)
- DataSourceProvider 类(它似乎是 ItemsSource 的包装器,但我没有看到必须在 Data 属性中返回什么)
- INotifyPropertyChanged 接口(告诉某个属性已更改,但我没有项目或至少项目没有属性)
- ICustomTypeDescriptor 接口(好的,但是一旦我使用 GetProperties() 返回了属性,数据网格将如何尝试修改不存在的属性?)
如您所见,选择一种实现良好代理的方式令人困惑。
【问题讨论】:
-
我想你错过了INotifyCollectionChanged,当你实现它时应该通知项目的变化。
-
我也看到了那个,但它不是我要绑定的集合,它是一个自定义对象,具有他自己的编辑、绑定、添加和通知机制。
-
INotifyCollectionChanged 与 ICollection 没有关联,它只是让订阅者(又名)数据网格知道您何时添加、删除或移动了行显示的数据。