常见的可绑定接口

use*_*rbb 3 .net c# data-binding datatable interface

是什么让这些集合具有可绑定性?是否有通用接口List,DataTable可以绑定到同一个控件?

Mar*_*ell 6

要解释如何List<T>DataTable工作(问题的脚注),请阅读以下内容,但注意到:

  • List<T>实现IList并具有public T this[int index] {get;}用于解析元数据的
  • DataTableimplements IListSource,提供表的默认值DataView; 的DataView器具IList,和器具ITypedList提供的元数据

集合按以下顺序绑定:

  • 来源进行测试IListSource; 如果可以的话,IList是通过GetList()
  • 否则来源进行测试IList; 如果不可用则抛出异常

然后IList查询元数据:

  • IList被测试ITypedList; 如果可用,这是通过使用GetProperties
  • IList公共类型(非对象)索引器进行测试,即public Foo this[int index] { get; }- 如果找到,Foo则暗示为通过类型和元数据获得的TypeDescriptor.GetProperties(Type)
  • 否则通过GetType()类型和通过获取的元数据查询第一个项目(如果非空)TypeDescriptor.GetProperties(Type)

我们现在可以访问items(IList)及其元数据; 提供额外支持(可选)IBindingList(提供双向绑定和基本排序等),IBindingListView(提供高级排序,过滤等),ICancelAddNew以及IRaiseItemChangedEvents.

对于大多数常见的场景(显示数据和推送更改)List<T>很好; 如果你需要显示不相关的更新,因为它们发生了BindingList<T>帮助 - 但请注意,为了支持成员级更新(而不是仅添加/删除/等),T必须实现INotifyPropertyChanged

作为参考,"元数据"在这里表示"一组PropertyDescriptors"(每列/属性1个),它提供对底层数据的访问(当提供时object),以及有关成员本身的信息(名称,类型等).