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

5

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

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

提前感谢您。


请查看以下链接:https://dev59.com/fW035IYBdhLWcg3wVebn,https://dev59.com/s3A75IYBdhLWcg3wB0ZP和http://stackoverflow.com/questions/4742449/new-to-wpf-data-binding。 - Sandeep G B
@Sandeep G B,那不是我的问题。我知道如何进行绑定,我想知道DataGrid如何与任何对象在内部完成它。 - Vale
2个回答

3
这是一个复杂的领域;以下是从winforms绑定中分解出来的内容,但我知道WPF绑定并没有太大区别:
- 给定一个对象,绑定代码将首先查找IListSource - 如果有,则使用GetList()获取实际绑定(这就是数据表成为数据视图以进行绑定的方式) - 之后,通常会检查源是否具有ITypedList;这充当了一种灵活的方式来获得由模型表示的伪属性(GetItemProperties());数据视图实现ITypedList,每个实例创建伪属性 - 否则,可能可以识别数据的明显类型,这可能意味着: - 查找形式为public SomeType this[int index] {get;}的索引器 - 注意,大多数集合都符合此条件 - (WinForms未完成,但WPF可能会完成)通过反射解析IList或IEnumerable中的T(如果对象实现了这些接口) - 从源中获取第一个对象(如果有),并使用GetType() - 一旦知道类型,就可以使用TypeDescriptor.GetProperties(type)获取属性;在许多情况下,这将通过反射进行,但也可以添加间接层(通过TypeDescriptionProvider)来为类型提供属性(这可以在运行时添加,非常方便) - 在单个绑定(而不是列表绑定)的情况下,还有TypeDescriptor.GetProperties(obj) - 除了反射和TypeDescriptionProvider之外,它还支持ICustomTypeDescriptor,可以由单个对象实现以在运行时提供自定义属性(非常类似于TypeDescriptionProvider,但是单个对象负责属性)。
我不确定这些内容有多少适用于WPF绑定,但我非常确定IListSource和ITypedList处理是相同的。从记忆中看,大多数(全部?)winforms策略都适用于WPF - 因此可能是任何变化都是额外的钩子。

谢谢,你的回答给了我解决问题的思路。 - Vale

0

我认为:

你可以通过其Collection的元素获取Type,这个Type有一个GetProperties()方法,它返回其类型中所有可用的公共属性,一旦知道了所有公共属性,就可以将其绑定。


是的,但是它如何与DataView一起工作呢?它是DataRowView对象的集合,这些对象没有Column属性,但它们仍然绑定到列。 - Vale
我觉得这篇文章应该会有所帮助 MSDN。Field<Type>(string) - 也许你在搜索这个? - stukselbax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接