私はまだ DynamicObjects を試しています。ここで、いくつかの情報が必要です。DynamicObject から継承するオブジェクトを (Silverlight ではなく) WPF DataGrid にバインドしようとしています。
通常は実行時に生成されるオブジェクトの使用可能なパブリック プロパティから DataGrid が自動的に列を作成するようにするにはどうすればよいですか? それは実際に可能ですか?
私はまだ DynamicObjects を試しています。ここで、いくつかの情報が必要です。DynamicObject から継承するオブジェクトを (Silverlight ではなく) WPF DataGrid にバインドしようとしています。
通常は実行時に生成されるオブジェクトの使用可能なパブリック プロパティから DataGrid が自動的に列を作成するようにするにはどうすればよいですか? それは実際に可能ですか?
動的プロパティを照会する統一された方法はありません。一般に、事前にそれらを知っていることが期待されます。を使用DynamicObject
すると、実装者はオーバーライドGetMemberNames
でき、通常はプロパティが提供されますが、すべてのプロパティを提供する必要がないため、実際にはデバッグ用です。それ以外の場合DynamicObject
は、独自のメソッドを作成して、動的実装に基づいてプロパティを取得する必要があります。たとえば、インターフェイスExpandoObject
を使用してすべてのプロパティをクエリできます。IDictionary
したがって、プロパティを取得する方法を取得したら、DataGrid に通知する必要があります。残念ながら DataGrid では、ICustomTypeDescriptor
プロパティについて DataGrid に通知するための実装の問題は、DataGrid がインスタンスではなく Type を使用して TypeDescriptors を取得することです。これは Dynamic オブジェクトの問題ですがITypedList
、DynamicObjects のコレクションへの実装は非常に小さいコレクションに非ジェネリック インターフェイスを実装しない場合IList
、チェックするポイントに到達する前に取り除かれますITypeList
。
要約すると、 と を使用してコレクションを実装しITypedList
ますIList
。ITypedList
return null forを使用GetListName
して実装するだけ GetItemProperties(PropertyDescriptor[] listAccessors)
です。listAccessors
リスト内で最も適切に表現された動的オブジェクト インスタンス (おそらく最初のオブジェクト) に基づいて名前が付けられた各メンバーの PropertyDescriptor の PropertyDescriptorCollection を無視して返します。PropertyDescriptor のサブクラスを実装する必要があります。値を取得/設定するための簡単で一般的な方法は、オープンソース フレームワークの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