Question

Je personnalisant comment un type d'objet est affiché dans une PropertyGrid en mettant en œuvre ICustomTypeDescriptor. Je permet à l'utilisateur de créer leurs propres propriétés personnalisées qui sont stockées dans un dictionnaire unique des clés et des valeurs. Je suis en mesure de créer toutes les PropertyDescriptors pour ces valeurs et de les voir dans la grille de la propriété. Cependant, je veux aussi montrer toutes les propriétés par défaut qui aurait autrement si le PropertyGrid représentés était peuplée par la réflexion plutôt que ma méthode de ICustomTypeDescriptor.GetProperties override.

Maintenant, je sais comment obtenir le type de l'objet, puis GetProperties(), mais retourne un tableau de PropertyInfo pas ProperyDescriptor. Alors, comment puis-je convertir l'objet PropertyInfo du type en objets PropertyDescriptor 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);
Était-ce utile?

La solution

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType);

En aparté. Cela ne comprend pas vos personnalisations ICustomTypeDescriptor, mais inclure toutes les personnalisations effectuées via TypeDescriptionProvider

(modifier) En tant que deuxième 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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top