我仍在試驗DynamicObjects。現在我需要一些信息:我試圖將從DynamicObject繼承的對象綁定到WPF DataGrid(而不是Silverlight)。使用自動列生成將DynamicObject綁定到DataGrid?
如何讓DataGrid從通常在運行時生成的對象的可用公共屬性中自動創建其列?這實際上可能嗎?
我仍在試驗DynamicObjects。現在我需要一些信息:我試圖將從DynamicObject繼承的對象綁定到WPF DataGrid(而不是Silverlight)。使用自動列生成將DynamicObject綁定到DataGrid?
如何讓DataGrid從通常在運行時生成的對象的可用公共屬性中自動創建其列?這實際上可能嗎?
沒有統一的方法來查詢動態屬性,通常預計您會提前知道它們。使用DynamicObject
,實現者可能會覆蓋GetMemberNames
,並且通常會爲您提供屬性,但它確實意味着要進行調試,因爲它沒有要求提供所有屬性。否則,如果它是你自己的DynamicObject
你只需要編寫自己的方法來獲取基於動態實現的屬性。例如ExpandoObject
可讓您使用IDictionary
接口查詢所有屬性。
所以一旦你有辦法得到你的屬性,你需要告訴DataGrid。不幸的是,對於DataGrid,執行ICustomTypeDescriptor
來告訴DataGrid有關你的屬性的問題是DataGrid使用Type而不是實例來獲取TypeDescriptors,這是Dynamic對象的一個問題,但是在DynamicObjects集合上實現ITypedList
將與如果你沒有在你的集合上實現非通用的IList
接口,它會很小,但它會在它檢測到ITypeList
之前被刪除。
所以總之,實施一個集合ITypedList
和IList
。用ITypedList
爲GetListName
返回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);
}
}
}
我認爲DataGrid
使用TypeDescriptor
來獲取對象屬性來創建列。所以如果你的DynamicObject
執行ICustomTypeDescriptor
,你應該能夠達到這個目標。實施GetProperties
方法,以便它返回對象的動態屬性。
這是去使用Silverlight在任何情況下的方式,如SL沒有按」沒有'ITypedList'。 – McGarnagle 2013-04-30 16:20:16
這也適用於winforms。非常感謝你! – swe 2016-07-29 16:47:16