DataGrid如何绑定到任何集合的属性?

时间:2011-09-15 06:34:36

标签: c# wpf binding datagrid

我正在制作一个WPF用户控件,我希望在绑定意义上与DataGrid控件类似。我的问题是:DataGrid如何知道如何绑定到IEnumerable类型的任何集合?例如:您可以将DataView作为ItemsSource传递,也可以传递任何对象集合。 DataGrid如何通过查看以下内容来决定是绑定到DataView列还是绑定到对象的属性:

<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/>

提前致谢。

2 个答案:

答案 0 :(得分:3)

这是一个复杂的领域;以下是winforms绑定的细分,但据我所知,WPF绑定并没有那么不同;

  • 给定一个对象,绑定代码要做的第一件事就是查找IListSource - 如果是,请使用GetList()来获取实际绑定(这就是数据表成为数据视图的方式出于约束目的)
  • 之后,通常会检查来源ITypedList;这可以作为获取模型所代表的伪属性(GetItemProperties())的灵活方式; data-view实现ITypedList,为每个实例创建伪属性
  • 否则,可能会为数据识别一个明显的类型,这可能意味着:
    • 寻找public SomeType this[int index] {get;}形式的索引器 - 请注意,大多数集合都会满足此
    • (不是由winforms完成,但可能是针对WPF)如果对象实现了那些接口,则通过反映来解析TIList<T>中的IEnumerable<T>
    • 从第一个对象(如果有的话)中使用GetType()
  • 一旦知道某种类型,TypeDescriptor.GetProperties(type)可用于获取属性;在很多情况下,这将通过反射,但也可以添加一个间接层(通过TypeDescriptionProvider)来提供类型的属性(这可以在运行时添加,这可以非常方便)
  • 在单独绑定(不是列表绑定)的情况下,还有TypeDescriptor.GetProperties(obj) - 除了反射和TypeDescriptionProvider之外,它还支持ICustomTypeDescriptor,可以通过一个单独的对象,用于在运行时提供自定义属性(非常类似于TypeDescriptionProvider,但单个对象负责属性)

我不知道究竟有多少适用于WPF绑定,但我非常确定IListSourceITypedList处理是相同的。从内存来看,大多数(全部?)winforms策略都可以在WPF上运行 - 所以可能就是这样,而且更改是额外的挂钩。

答案 1 :(得分:0)

我认为

您可以获取其Type元素的Collection,此类型Type具有GetProperties()方法,该方法返回其类型中可用的所有公共属性,并且知道所有公共属性,它可以与它们绑定。