7Fermer9
ZephLe 15/05/2009 à 14:14
Alors je voudrais ajouter dynamiquement une propriété à un objet A, et cette propriété doit apparaître dans le PropertyGrid comme une valeur à choisir parmi une liste définie.

- J'ai un objet "ListValue" utilisé comme valeur de ma propriété. Il contient une valeur (numérique) et un descriptif (string). Il surcharge la méthode "ToString" qui fait un simple "return this.desc", j'espérais comme ça afficher le descriptif mais conserver la valeur numérique.

- J'ai un objet "ListTypeConverter" qui hérite de "TypeConverter" et surcharge les méthodes "GetStandardValuesSupported", "GetStandardValuesExclusive" et "GetStandardValues" pour définir la liste des choix possibles. Il retourne une collection de type "TypeConverter.StandardValuesCollection" remplie avec des objets de type "ListValue".

- J'ai un objet "ListPropertyDescriptor" qui hérite de "PropertyDescriptor", il s'agit donc de ma propriété. Il possède un "TypeConverterAttribute" instancié avec "ListTypeConverter" parmi ses attributs pour prendre en compte le fait qu'il s'agisse d'une liste de choix. Son accesseur "PropertyType" retourne "typeof (ListValue)", et sa méthode "GetValue" retourne la valeur courante de type "ListValue" également.

- Enfin, j'ai mon objet "A" qui contient une "PropertyDescriptorCollection" pour contenir ses propriétés, parmi lesquelles se trouvent une instance de "ListPropertyDescriptor".

Visuellement j'obtiens bien le résultat voulu (ça), mais si je choisis un élément dans la liste (supposée être une liste de "ListValue" si je ne me plante pas) ça m'appelle la méthode "SetValue" de la classe "ListPropertyDescriptor" en passant en paramètre une valeur de type "String" (le texte correspondant au choix que j'ai sélectionné, par exemple "Choix #2") au lieu de mon objet "ListValue" d'origine. Du coup je ne peux plus rien en faire, c'est sa valeur qui m'intéresse et non pas sa description textuelle.

J'ai vu qu'on peut utiliser les TypeConverters pour convertir les données au moment de l'affichage et effectuer une conversion inverse au moment de la sélection, mais ça fait deux traitements supplémentaires dont je ne vois pas l'intérêt. On ne peut pas tout simplement continuer à manipuler le type initial tout le temps ?