2010-03-18 68 views

回答

10

没有统一的方法来查询动态属性,通常预计您会提前知道它们。使用DynamicObject,实现者可能会覆盖GetMemberNames,并且通常会为您提供属性,但它确实意味着要进行调试,因为它没有要求提供所有属性。否则,如果它是你自己的DynamicObject你只需要编写自己的方法来获取基于动态实现的属性。例如ExpandoObject可让您使用IDictionary接口查询所有属性。

所以一旦你有办法得到你的属性,你需要告诉DataGrid。不幸的是,对于DataGrid,执行ICustomTypeDescriptor来告诉DataGrid有关你的属性的问题是DataGrid使用Type而不是实例来获取TypeDescriptors,这是Dynamic对象的一个​​问题,但是在DynamicObjects集合上实现ITypedList将与如果你没有在你的集合上实现非通用的IList接口,它会很小,但它会在它检测到ITypeList之前被删除。

所以总之,实施一个集合ITypedListIList。用ITypedListGetListName返回null,只是实现GetItemProperties(PropertyDescriptor[] listAccessors);忽略listAccessors,并根据列表中最好表示的动态对象实例(很可能只是第一个对象)为每个成员返回PropertyDescriptor的PropertyDescriptorCollection。你必须要实现的PropertyDescriptor的子类,一个简单和通用的方式来了get/set值是使用开源框架Dynamitey

using System; 
using System.ComponentModel; 
using Dynamitey; 
public class DynamicPropertyDescriptor:PropertyDescriptor 
{ 
     public DynamicPropertyDescriptor(string name) : base(name, null) 
     { 
     } 

     public override bool CanResetValue(object component) 
     { 
      return false; 
     } 

     public override object GetValue(object component) 
     { 
      return Dynamic.InvokeGet(component, Name); 
     } 

     public override void ResetValue(object component) 
     { 

     } 

     public override void SetValue(object component, object value) 
     { 
      Dynamic.InvokeSet(component, Name, value); 
     } 

     public override bool ShouldSerializeValue(object component) 
     { 
      return false; 
     } 

     public override Type ComponentType 
     { 
      get { return typeof(object); } 
     } 

     public override bool IsReadOnly 
     { 
      get { return false; } 
     } 

     public override Type PropertyType 
     { 
      get 
      { 
       return typeof (object); 
      } 
     } 
} 
+0

这也适用于winforms。非常感谢你! – swe 2016-07-29 16:47:16

2

我认为DataGrid使用TypeDescriptor来获取对象属性来创建列。所以如果你的DynamicObject执行ICustomTypeDescriptor,你应该能够达到这个目标。实施GetProperties方法,以便它返回对象的动态属性。

+0

这是去使用Silverlight在任何情况下的方式,如SL没有按”没有'ITypedList'。 – McGarnagle 2013-04-30 16:20:16