我还在尝试使用DynamicObjects。现在我需要一些信息:我正在尝试将从DynamicObject继承的对象绑定到WPF DataGrid(而不是Silverlight)。
如何让DataGrid从通常在运行时生成的对象的可用公共属性中自动创建其列?实际上可能吗?
答案 0 :(得分:10)
没有统一的方法来查询动态属性,通常预计您会提前知道它们。使用DynamicObject
,实现者可以覆盖GetMemberNames
并且通常会为您提供属性,但它实际上是用于调试,因为不要求它提供所有属性。否则,如果它是您自己的DynamicObject
,您只需编写自己的方法即可根据动态实现获取属性。例如,ExpandoObject
允许您使用IDictionary
接口查询所有属性。
因此,一旦有了获取属性的方法,就需要告诉DataGrid。不幸的是,使用DataGrid时,实现ICustomTypeDescriptor
告诉DataGrid有关属性的问题是DataGrid使用Type而不是实例来获取TypeDescriptors,这对于Dynamic对象来说是一个问题,但实现ITypedList
如果你没有在你的集合上实现非泛型IList
接口,那么DynamicObjects的集合将使用非常微小的陷阱,它将在它到达检查{{1}的点之前被剥离。 }}
总而言之,使用ITypeList
和ITypedList
实施集合。 IList
的{{1}}返回null,只需实现ITypedList
;忽略GetListName
并为基于列表中最佳表示的动态对象实例命名的每个成员返回PropertyDescriptors的PropertyDescriptorCollection(很可能只是第一个对象)。您必须实现PropertyDescriptor的子类,Get / Set值的一种简单而通用的方法是使用opensource框架Dynamitey
GetItemProperties(PropertyDescriptor[] listAccessors)
答案 1 :(得分:2)
我认为DataGrid
使用TypeDescriptor
来获取对象属性来创建列。因此,如果DynamicObject
实施ICustomTypeDescriptor
,您应该能够实现这一目标。实现GetProperties
方法,以便它返回对象的动态属性。