关于O/R中数据绑定功能的支持
要实现完整的数据绑定功能,工作量还是很大的。
(以下提供的类如未特别表明,均来自System.ComponentModel)
1、设计时,控件如何知道我的载体有多少字段?
.NET Framework通过对象TypeDescriptor的GetProperties方法获取单个对象公开属性的列表,列表的项目类型是PropertyDescriptor,他和System.Reflection.PropertyInfo有些相近,用来描述你的属性是什么样的。
但注意的是,我们知道DataTable在MS设计好后,就固定那几个属性,问题是我们绑定的是其中的字段,而不是他的什么TableName属性,MS为什么可以搞特殊化呢?这里通过ICustomTypeDescriptor接口实现的(是DataRowView实现的,具体原因下面再说),TypeDescriptor的GetProperties内部执行时,会检测你的对象是否支持ICustomTypeDescriptor,如果支持将作为优先输出结果。
备注:TypeDescriptor的GetProperties工作时,还会考虑是否是COM接口的。
2、我如何告诉表格我的集合中存储的明细类型?
我在绑定一个DataTable时,表格控件自动就知道有多少列,而我自定义的集合类,他如何知道明细的类型,以便决定显示多少列?
优先级最高的是你的集合支持ITypedList,这个接口表明了你的集合明细的属性列表;
如果你的集合有个强类型的Item(C#叫this索引),这样也是可以的。
3、我的集合绑定到表格时编辑功能没有dataset的强大?
例如dataset绑定后可以排序等功能,而我的为什么不可以(可以也行),这个原因是你的集合是否完整支持IBindingList,他定义了丰富的集合编辑特性;
另外让你的实体(非集合)支持IEditableObject将可以在编辑改动取消掉。
4、DataSet可以设置一个错误信息,然后我的绑定控件后面就一个感叹号在闪烁,我如何能够做到?
这需要你的实体支持IDataErrorInfo,以便获得此功能。
5、你说的那么多接口,但我没有看见DataTable、DataSet支持这些接口啊,你是不是讲错了?
你没有说错,我也没有完全说错,MS的做法讲绑定的实现从DataTable、DataSet和DataRow中移动到DataView、DataViewManager和DataRowView中,这样做到职能更加清晰。
他通过IListSource来转移这种绑定,使控件实际绑定到这些View中。
以上仅是简单介绍,具体还很复杂。
目前我所看见的绝大多数OR设计没有考虑绑定机制。