gpt4 book ai didi

c# - DataGrid 如何绑定(bind)到任何集合的属性?

转载 作者:太空狗 更新时间:2023-10-29 23:33:58 34 4
gpt4 key购买 nike

我正在制作一个 WPF 用户控件,我希望在绑定(bind)方面具有与 DataGrid 控件类似的行为。我的问题是:DataGrid 如何知道如何绑定(bind)到任何 IEnumerable 类型的集合?例如:你可以传递一个DataView作为ItemsSource,你也可以传递任何对象集合。 DataGrid 如何决定是绑定(bind)到 DataView 的列,还是绑定(bind)到对象的属性,只看这个:

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

提前致谢。

最佳答案

这是一个复杂的区域;以下是 winforms 绑定(bind)的分割,但我知道 WPF 绑定(bind)没有什么不同;

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

我不知道其中有多少适用于 WPF 绑定(bind),但我很确定 IListSourceITypedList处理是相同的。根据内存,大多数(全部?)winforms 策略都适用于 WPF - 所以它可能是这样,并且更改是附加 Hook 。

关于c# - DataGrid 如何绑定(bind)到任何集合的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7426761/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com