質問

私はまだ 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メソッドを実装します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top