2010-03-18 66 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