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