Question

J'ai un ensemble de PropertyDescriptor personnalisé que je veux ajouter à des catégories afin qu'elles s'affichent de manière plus organisée dans un PropertyGrid. Je souhaite que chaque type de PropertyDescriptor soit classé dans une catégorie spécifique.

J'ai essayé d'utiliser TypeDescriptor.AddAttributes () pour ajouter des attributs à un PropertyDescriptor existant, mais l'attribut category n'a pas été ajouté.

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

J'ai également essayé d'utiliser TypeDescriptor.AddAttributes () dans le constructeur de l'un de mes PropertyDescriptors, comme indiqué ci-dessous. Mais ça ne marche pas non plus.

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

Je préférerais ne pas passer le temps à détailler pourquoi je fais ce que je fais. Mais dans l'exemple ci-dessus, IntrinsicPropertyDef est une classe qui définit une propriété, y compris un nom, un nom complet et un type. PropDef.Attributes inclut donc DisplayNameAttribute.

Un IntrinsicPropertyDef peut être affiché avec deux PropertyDescriptors personnalisés IntrinsicPropertyDescriptor et InferedIntrinsicPropertyDescriptor. Chaque descripteur IntrinsicPropertyDescriptor doit avoir un attribut de catégorie "Propriétés intrinsèques", et chaque descripteur InferedIntrinsicPropertyDescriptor doit avoir un attribut de catégorie "Propriétés intrinsèques inférées".

Était-ce utile?

La solution

Je crois que vous pouvez simplement remplacer la catégorie :

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

Pour d'autres scénarios; En général, avec un PropertyDescriptor personnalisé, vous spécifiez des attributs dans le constructeur. Vous devrez développer l'argument Attribute [] pour inclure le CategoryAttribute . Si vous devez effectuer un traitement, vous pouvez utiliser une méthode statique - non testée:

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

Notez également que pour pouvoir utiliser un PropertyDescriptor , le système doit le trouver ... les règles de résolution sont les suivantes:

  • pour PropertyGrid , le TypeConverter fournit les propriétés, par défaut les propriétés d'une instance (ci-dessous)
  • pour une instance:
    • ICustomTypeDescriptor est coché
    • sinon il recherche un TypeDescriptionProvider enregistré pour l'instance ou le type
    • sinon, la réflexion est utilisée
  • pour un type:
    • recherche un TypeDescriptionProvider enregistré pour le type
    • sinon, la réflexion est utilisée
  • pour les listes:
    • IListSource est vérifié et résolu en liste (le traitement continue)
    • ITypedList est vérifié
    • sinon, le type de liste est vérifié pour un indexeur non-objet - c.-à-d. public SomeType this [int index] {get;}
      • si tel est trouvé, les propriétés du type SomeType sont utilisées, comme défini ci-dessus
    • sinon, si la liste n'est pas vide, les propriétés de la première instance ( list [0] ) sont utilisées, comme défini ci-dessus
    • sinon, les métadonnées ne sont pas disponibles
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top