【问题标题】:How does DataGrid bind to properties of any collection?DataGrid 如何绑定到任何集合的属性?
【发布时间】:2011-11-17 14:41:29
【问题描述】:

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

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

提前致谢。

【问题讨论】:

标签: c# wpf binding datagrid


【解决方案1】:

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

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

我不知道这在多大程度上适用于 WPF 绑定,但我很确定 IListSourceITypedList 处理是相同的。根据记忆,大多数(全部?)winforms 策略都适用于 WPF - 所以可能是这样,并且更改是 附加 钩子。

【讨论】:

  • 谢谢,您的回答让我知道了如何解决我的问题。
【解决方案2】:

我认为

你可以得到它的Collection的元素的Type,这个类型TypeGetProperties()方法,它返回它类型中所有可用的公共属性,并且在它知道所有公共属性之后,它可以绑定跟他们。

【讨论】:

  • 是的,但是它如何与 DataView 一起工作?它是 DataRowView 对象的集合,这些对象没有 Column 属性,它们仍然绑定到列。
  • 我认为这篇文章应该对MSDN有所帮助。 Field(string) - 你可以搜索这个吗?
猜你喜欢
  • 2014-10-05
  • 2016-10-08
  • 1970-01-01
  • 2022-07-09
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2017-04-18
  • 2016-12-10
相关资源
最近更新 更多