Frage

Ich habe eine Reihe von benutzerdefinierten PropertyDescriptor, die ich will auch Kategorien hinzuzufügen, so dass sie in einer organisierten Art und Weise in einem Property anzuzeigen. Ich mag jede Art von PropertyDescriptor in eine bestimmte Kategorie gehen.

Ich habe mit TypeDescriptor.AddAttributes versucht () Attributen zu einem vorhandenen PropertyDescriptor hinzuzufügen, aber das Kategorie-Attribut wird nicht hinzugefügt.

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

Ich habe auch versucht TypeDescriptor.AddAttributes () im Konstruktor für einen meines propertyDescriptors wie unten gezeigt werden. Aber es funktioniert auch nicht.

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 });
}

Ich möchte lieber nicht verbringen die Zeit des Gehens in Detail, warum ich tue, was ich tue. Aber in dem obigen Beispiel IntrinsicPropertyDef ist eine Klasse, die eine Eigenschaft mit einem Namen, Anzeigenamen und Typ definiert. So umfasst propDef.Attributes den Displaynamen.

Ein IntrinsicPropertyDef kann mit zwei verschiedenen benutzerdefinierten propertyDescriptors IntrinsicPropertyDescriptor und InferedIntrinsicPropertyDescriptor angezeigt werden. Jeder IntrinsicPropertyDescriptor sollte eine Kategorie Attribut „Intrinsic Eigenschaften“ hat, und jedes InferedIntrinsicPropertyDescriptor sollte eine Kategorie Attribut „Inferred Intrinsic Eigenschaften“ hat.

War es hilfreich?

Lösung

I glauben Sie können einfach die Category außer Kraft setzen:

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

Für andere Szenarien; in der Regel mit einem benutzerdefinierten PropertyDescriptor, Sie Attribute im Konstruktor angeben. Sie müssen das Attribute[] Argument erweitern, um den CategoryAttribute aufzunehmen. Wenn Sie irgendeine Verarbeitung tun, dann können Sie eine statische Methode verwenden - nicht getestet:

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"))
{...}

Auch - beachten Sie, dass für eine PropertyDescriptor verwendet werden, wobei das System es finden müssen ... die Auflösung Regeln sind:

  • für PropertyGrid stellt die TypeConverter die Eigenschaften, für eine Instanz auf die Eigenschaften säumige (unten)
  • für eine Instanz:
    • ICustomTypeDescriptor wird geprüft
    • ansonsten überprüft es für eine registrierte TypeDescriptionProvider für die Instanz oder Typ
    • sonst Reflexion wird verwendet,
  • für einen Typ:
    • überprüft es für einen registrierten TypeDescriptionProvider für den Typ
    • sonst Reflexion wird verwendet,
  • für Listen:
    • IListSource wird geprüft und beschlossen, eine Liste (die Verarbeitung fortgesetzt wird)
    • ITypedList wird geprüft
    • ansonsten der Listentyp ist für ein nicht-Objekt Indexer geprüft - das heißt public SomeType this[int index] {get;}
      • , wenn diese gefunden wird, dann werden die Eigenschaften für den Typ SomeType verwendet werden, wie oben definiert,
    • sonst, wenn die Liste nicht leer ist, werden die Eigenschaften der ersten Instanz (list[0]) verwendet wird, wie oben definiert,
    • andernfalls Metadaten ist nicht verfügbar
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top