Domanda

Sono la personalizzazione come un tipo di oggetto viene visualizzato in una PropertyGrid implementando ICustomTypeDescriptor. Sto permettendo all'utente di creare i propri proprietà personalizzate che vengono memorizzate in un unico dizionario di chiavi e valori. Sono in grado di creare tutte le PropertyDescriptors per questi valori e visualizzarli nella griglia proprietà. Tuttavia, ho anche voglia di mostrare tutte le proprietà predefinite che altrimenti sarebbe disponibile se il PropertyGrid era popolata attraverso la riflessione piuttosto che il mio metodo di sostituzione ICustomTypeDescriptor.GetProperties.

Ora so come ottenere il tipo di oggetto, e poi GetProperties(), ma questo restituisce un array di PropertyInfo non ProperyDescriptor. Così come posso convertire l'oggetto PropertyInfo del tipo in oggetti PropertyDescriptor di includere nella mia collezione con l'PropertyDescriptors personalizzato?

//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);
È stato utile?

Soluzione

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType);

Per inciso:. Questo non includerà le vostre personalizzazioni ICustomTypeDescriptor, ma includere eventuali personalizzazioni effettuate tramite TypeDescriptionProvider

(modifica) Come secondo a parte - è anche possibile modificare PropertyGrid fornendo un TypeConverter - molto più semplice di quanto sia ICustomTypeDescriptor o TypeDescriptionProvider - ad esempio:

[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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top