2009-04-09 7 views
9

Je personnalise comment un type d'objet est affiché dans un PropertyGrid en implémentant ICustomTypeDescriptor. Je permets à l'utilisateur de créer ses propres propriétés personnalisées qui sont stockées dans un seul dictionnaire de clés et de valeurs. Je suis en mesure de créer tous les PropertyDescriptors pour ces valeurs et les afficher dans la grille des propriétés. Cependant, je veux également montrer toutes les propriétés par défaut qui auraient autrement montré si le PropertyGrid a été rempli par la réflexion plutôt que ma méthode de remplacement ICustomTypeDescriptor.GetProperties.Récupère les PropertyDescriptors par défaut pour un type

Maintenant, je sais comment obtenir le type de l'objet, puis GetProperties(), mais cela renvoie un tableau de PropertyInfo pas ProperyDescriptor. Alors, comment puis-je convertir l'objet PropertyInfo en PropertyDescriptor objets à inclure dans ma collection avec le PropertyDescriptors personnalisé?

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

Répondre

15
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType); 

En aparté: il ne comprend pas vos ICustomTypeDescriptor customisations, mais il sera inclure toutes les personnalisations effectuées via TypeDescriptionProvider.

(modifier) ​​ En second côté - vous pouvez également modifier PropertyGrid en fournissant un TypeConverter - beaucoup plus simple que ce soit ICustomTypeDescriptor ou TypeDescriptionProvider - par exemple:

[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

Merci beaucoup! – Ross

Questions connexes