1

カテゴリも追加して、PropertyGrid でより整理された方法で表示するカスタム PropertyDescriptor のセットがあります。PropertyDescriptor の各タイプを特定のカテゴリに分類したいと考えています。

TypeDescriptor.AddAttributes() を使用して既存の PropertyDescriptor に属性を追加しようとしましたが、カテゴリ属性が追加されません。

CategoryAttribute intrinsicPropertyCategory = new CategoryAttribute("Intrinsic Properties");
currentDescriptor = new IntrinsicPropertyDescriptor(def);
TypeDescriptor.AddAttributes(currentDescriptor, new Attribute[] { intrinsicPropertyCategory });

また、以下に示すように、PropertyDescriptor の 1 つのコンストラクターで TypeDescriptor.AddAttributes() を使用してみました。しかし、それも機能しません。

public IntrinsicPropertyDescriptor(IntrinsicPropertyDef propDef): base(propDef.Key, propDef.Attributes)
{
this._type = propDef.Type;
this._key = propDef.Key;
this._readOnly = propDef.ReadOnly;

CategoryAttribute intrinsicPropertyCategory = new CategoryAttribute("Intrinsic Properties");
TypeDescriptor.AddAttributes(this, new Attribute[] { intrinsicPropertyCategory });
}

なぜ自分がしていることをしているのかを詳しく説明するのに時間をかけたくありません。ただし、上記の例では、IntrinsicPropertyDef は、名前、表示名、およびタイプを含むプロパティを定義するクラスです。したがって、propDef.Attributes には DisplayNameAttribute が含まれます。

IntrinsicPropertyDef は、2 つの異なるカスタム PropertyDescriptors IntrinsicPropertyDescriptor および InferedIntrinsicPropertyDescriptor で表示できます。すべての IntrinsicPropertyDescriptor にはカテゴリ属性 "Intrinsic Properties" が必要であり、すべての InferedIntrinsicPropertyDescriptor にはカテゴリ属性 "Inferred Intrinsic Properties" が必要です。

4

1 に答える 1

4

私はあなたが単にオーバーライドできると信じていCategoryます:

public override string Category { get {return "Foo";}}

他のシナリオの場合。通常、 customPropertyDescriptorでは、コンストラクターで属性を指定します。Attribute[]を含めるには、引数を展開する必要がありますCategoryAttribute。何らかの処理を行う必要がある場合は、静的メソッドを使用できます-未テスト:

static Attribute[] AddCategory(Attribute[] attributes, string category) {
    Array.Resize(ref attributes, attributes.Length + 1);
    attributes[attributes.Length - 1] = new CategoryAttribute(category);
    return attributes;
}
public IntrinsicPropertyDescriptor(IntrinsicPropertyDef propDef)
     : base(propDef.Key, AddCategory(propDef.Attributes, "Foo"))
{...}

また、 aPropertyDescriptorを使用するには、システムがそれを見つける必要があることに注意してください...解決ルールは次のとおりです。

  • の場合PropertyGridTypeConverterはプロパティを提供し、インスタンスのプロパティがデフォルトになります (以下)。
  • インスタンスの場合:
    • ICustomTypeDescriptorチェックされています
    • TypeDescriptionProviderそれ以外の場合は、インスタンスまたはタイプに登録されているかどうかを確認します
    • それ以外の場合は反射が使用されます
  • タイプの場合:
    • TypeDescriptionProviderタイプに登録されているかどうかをチェックします
    • それ以外の場合は反射が使用されます
  • リストの場合:
    • IListSourceチェックされ、リストに解決されます (処理は続行されます)
    • ITypedListチェックされています
    • それ以外の場合は、非オブジェクト インデクサーのリスト タイプがチェックされます。つまり、public SomeType this[int index] {get;}
      • SomeTypeそのようなものが見つかった場合、上記で定義されているように、そのタイプのプロパティが使用されます
    • それ以外の場合、リストが空でない場合は、list[0]上記で定義したように、最初のインスタンス ( ) のプロパティが使用されます。
    • それ以外の場合、メタデータは利用できません
于 2009-05-05T19:40:19.210 に答える