通用可绑定接口
本文关键字:接口 绑定 | 更新日期: 2023-09-27 17:49:38
集合是可绑定的?List
、DataTable
是否有可以绑定到同一控件的通用接口?
要解释List<T>
和DataTable
是如何工作的(问题的脚注(,请阅读以下内容,但要注意:
List<T>
实现IList
并具有用于解析元数据的public T this[int index] {get;}
DataTable
实现了IListSource
,它提供了表的默认DataView
;DataView
实现IList
,并实现ITypedList
以提供元数据
集合按以下顺序绑定:
- 对源进行CCD_ 14测试;如果可用,则通过
GetList()
获得IList
- 否则对源进行CCD_ 17测试;如果不可用,则引发异常
则查询CCD_ 18的元数据:
- 对CCD_ 19进行CCD_;如果可用,则通过
GetProperties
使用 IList
是针对公共类型(非对象(索引器进行测试的,即public Foo this[int index] { get; }
-如果找到,则暗示Foo
是通过TypeDescriptor.GetProperties(Type)
获得的类型和元数据- 否则,通过
GetType()
查询第一个项目(如果非空(的类型,并通过TypeDescriptor.GetProperties(Type)
获取元数据
我们现在可以访问项目(IList
(及其元数据;额外支持(可选(通过IBindingList
(提供双向绑定和基本排序等(、IBindingListView
(提供高级排序、过滤等(、ICancelAddNew
和IRaiseItemChangedEvents
提供。
对于大多数常见的场景(显示数据并向后推送更改(,List<T>
是可以的;如果您需要在发生时显示不相关的更新,BindingList<T>
会有所帮助,但请注意,要支持成员级别的更新(而不仅仅是添加/删除等(,T
必须实现INotifyPropertyChanged
作为参考,"元数据"在这里的意思是"一组PropertyDescriptor
"(每列/属性1个(,它提供对底层数据的访问(当提供object
时(以及关于成员本身的信息(名称、类型等(。
大多数控件都可以绑定到IList接口。
http://msdn.microsoft.com/en-us/library/system.collections.ilist.aspx
IBindingList