2009-04-09 1 views
9

PropertyGridにオブジェクトタイプをどのように表示するかをカスタマイズするには、ICustomTypeDescriptorを実装します。キーと値の単一の辞書に格納されている独自のカスタムプロパティをユーザーが作成できるようにしています。これらの値のすべてをPropertyDescriptorsに作成し、プロパティグリッドで表示することができます。しかし、PropertyGridが私のオーバーライドICustomTypeDescriptor.GetPropertiesメソッドではなくリフレクションによって設定されていた場合、それ以外の場合に表示されるデフォルトプロパティもすべて表示したいと考えています。タイプのデフォルトのPropertyDescriptorsを取得

オブジェクトの型を取得する方法を知っていて、次にGetProperties()を取得しましたが、PropertyInfoではなくProperyDescriptorの配列が返されます。では、タイプPropertyInfoのオブジェクトをPropertyDescriptorオブジェクトに変換して、自分のコレクションにカスタムPropertyDescriptorsを含めるにはどうすればよいですか?余談として

//gets the local intrinsic properties of the object 
Type thisType = this.GetType(); 
PropertyInfo[] thisProps = thisType.GetProperties(); 

//this line obviously doesn't work because the propertydescriptor 
//collection needs an array of PropertyDescriptors not PropertyInfo 
PropertyDescriptorCollection propCOl = 
    new PropertyDescriptorCollection(thisProps); 

答えて

15
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType); 

:これはあなたのICustomTypeDescriptorカスタマイゼーションは含まれませんが、それはTypeDescriptionProviderを経由して行われたすべてのカスタマイゼーションを含まれます。

(編集) 余談秒として - あなたはまた、TypeConverterを提供することにより、PropertyGridを微調整することができます - ICustomTypeDescriptorまたはTypeDescriptionProviderいずれよりもはるかに簡単 - 例えば:

[TypeConverter(typeof(FooConverter))] 
class Foo { } 

class FooConverter : ExpandableObjectConverter 
{ 
    public override PropertyDescriptorCollection GetProperties(
     ITypeDescriptorContext context, object value, Attribute[] attributes) 
    { 
     // your code here, perhaps using base.GetPoperties(
     // context, value, attributes); 
    } 
} 
+0

本当にありがとうございました! – Ross

関連する問題