通过自动列生成将DynamicObject绑定到DataGrid?

时间:2010-03-18 22:19:33

标签: wpf data-binding datagrid c#-4.0 dynamicobject

我还在尝试使用DynamicObjects。现在我需要一些信息:我正在尝试将从DynamicObject继承的对象绑定到WPF DataGrid(而不是Silverlight)。

如何让DataGrid从通常在运行时生成的对象的可用公共属性中自动创建其列?实际上可能吗?

2 个答案:

答案 0 :(得分:10)

没有统一的方法来查询动态属性,通常预计您会提前知道它们。使用DynamicObject,实现者可以覆盖GetMemberNames并且通常会为您提供属性,但它实际上是用于调试,因为不要求它提供所有属性。否则,如果它是您自己的DynamicObject,您只需编写自己的方法即可根据动态实现获取属性。例如,ExpandoObject允许您使用IDictionary接口查询所有属性。

因此,一旦有了获取属性的方法,就需要告诉DataGrid。不幸的是,使用DataGrid时,实现ICustomTypeDescriptor告诉DataGrid有关属性的问题是DataGrid使用Type而不是实例来获取TypeDescriptors,这对于Dynamic对象来说是一个问题,但实现ITypedList如果你没有在你的集合上实现非泛型IList接口,那么DynamicObjects的集合将使用非常微小的陷阱,它将在它到达检查{{1}的点之前被剥离。 }}

总而言之,使用ITypeListITypedList实施集合。 IList的{​​{1}}返回null,只需实现ITypedList;忽略GetListName并为基于列表中最佳表示的动态对象实例命名的每个成员返回PropertyDescriptors的PropertyDescriptorCollection(很可能只是第一个对象)。您必须实现PropertyDescriptor的子类,Get / Set值的一种简单而通用的方法是使用opensource框架Dynamitey

GetItemProperties(PropertyDescriptor[] listAccessors)

答案 1 :(得分:2)

我认为DataGrid使用TypeDescriptor来获取对象属性来创建列。因此,如果DynamicObject实施ICustomTypeDescriptor,您应该能够实现这一目标。实现GetProperties方法,以便它返回对象的动态属性。