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

Val*_*ale 5 c# wpf binding datagrid

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

<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/>
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Mar*_*ell 3

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

  • 给定一个对象,绑定代码要做的第一件事就是查找IListSource- 如果是的话,则用于GetList()获取实际的绑定(这就是数据表成为用于绑定目的的数据视图的方式)
  • 之后,通常会检查来源ITypedListGetItemProperties()这是获取模型所表示的伪属性 ( ) 的灵活方式;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 上运行 - 所以可能是这样,并且更改是额外的钩子。