12

私はまだ DynamicObjects を試しています。ここで、いくつかの情報が必要です。DynamicObject から継承するオブジェクトを (Silverlight ではなく) WPF DataGrid にバインドしようとしています。

通常は実行時に生成されるオブジェクトの使用可能なパブリック プロパティから DataGrid が自動的に列を作成するようにするにはどうすればよいですか? それは実際に可能ですか?

4

2 に答える 2

13

動的プロパティを照会する統一された方法はありません。一般に、事前にそれらを知っていることが期待されます。を使用DynamicObjectすると、実装者はオーバーライドGetMemberNamesでき、通常はプロパティが提供されますが、すべてのプロパティを提供する必要がないため、実際にはデバッグ用です。それ以外の場合DynamicObjectは、独自のメソッドを作成して、動的実装に基づいてプロパティを取得する必要があります。たとえば、インターフェイスExpandoObjectを使用してすべてのプロパティをクエリできます。IDictionary

したがって、プロパティを取得する方法を取得したら、DataGrid に通知する必要があります。残念ながら DataGrid では、ICustomTypeDescriptorプロパティについて DataGrid に通知するための実装の問題は、DataGrid がインスタンスではなく Type を使用して TypeDescriptors を取得することです。これは Dynamic オブジェクトの問題ですがITypedList、DynamicObjects のコレクションへの実装は非常に小さいコレクションに非ジェネリック インターフェイスを実装しない場合IList、チェックするポイントに到達する前に取り除かれますITypeList

要約すると、 と を使用してコレクションを実装しITypedListますIListITypedListreturn 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);
            }
        }
}
于 2011-03-14T13:39:03.517 に答える
2

オブジェクトのプロパティを取得して列を作成するのにDataGrid使用すると思います。したがって、実装TypeDescriptorする場合、これを達成できるはずです。オブジェクトの動的プロパティを返すようにメソッドを実装します。DynamicObjectICustomTypeDescriptorGetProperties

于 2010-08-20T01:37:45.637 に答える