关于O/R中数据绑定功能的支持

 

关于O/R中数据绑定功能的支持

要实现完整的数据绑定功能,工作量还是很大的。

(以下提供的类如未特别表明,均来自System.ComponentModel

 

1、设计时,控件如何知道我的载体有多少字段?

.NET Framework通过对象TypeDescriptorGetProperties方法获取单个对象公开属性的列表,列表的项目类型是PropertyDescriptor,他和System.Reflection.PropertyInfo有些相近,用来描述你的属性是什么样的。

但注意的是,我们知道DataTableMS设计好后,就固定那几个属性,问题是我们绑定的是其中的字段,而不是他的什么TableName属性,MS为什么可以搞特殊化呢?这里通过ICustomTypeDescriptor接口实现的(是DataRowView实现的,具体原因下面再说),TypeDescriptorGetProperties内部执行时,会检测你的对象是否支持ICustomTypeDescriptor,如果支持将作为优先输出结果。

备注:TypeDescriptorGetProperties工作时,还会考虑是否是COM接口的。

 

2、我如何告诉表格我的集合中存储的明细类型?

我在绑定一个DataTable时,表格控件自动就知道有多少列,而我自定义的集合类,他如何知道明细的类型,以便决定显示多少列?

优先级最高的是你的集合支持ITypedList,这个接口表明了你的集合明细的属性列表;

如果你的集合有个强类型的ItemC#this索引),这样也是可以的。

 

3、我的集合绑定到表格时编辑功能没有dataset的强大?

例如dataset绑定后可以排序等功能,而我的为什么不可以(可以也行),这个原因是你的集合是否完整支持IBindingList,他定义了丰富的集合编辑特性;

另外让你的实体(非集合)支持IEditableObject将可以在编辑改动取消掉。

 

4DataSet可以设置一个错误信息,然后我的绑定控件后面就一个感叹号在闪烁,我如何能够做到?

这需要你的实体支持IDataErrorInfo,以便获得此功能。

 

5、你说的那么多接口,但我没有看见DataTableDataSet支持这些接口啊,你是不是讲错了?

你没有说错,我也没有完全说错,MS的做法讲绑定的实现从DataTableDataSetDataRow中移动到DataViewDataViewManagerDataRowView中,这样做到职能更加清晰。

他通过IListSource来转移这种绑定,使控件实际绑定到这些View中。

 

以上仅是简单介绍,具体还很复杂。

目前我所看见的绝大多数OR设计没有考虑绑定机制。

原文地址:https://www.cnblogs.com/tansm/p/186189.html