Frage

Ich bin Customizing, wie ein Objekttyp in einem PropertyGrid durch die Implementierung ICustomTypeDescriptor angezeigt wird. Ich bin so dass der Benutzer ihre eigenen Eigenschaften zu schaffen, die in einem einzigen Wörterbuch von Schlüsseln und Werten gespeichert sind. Ich bin in der Lage alle PropertyDescriptors für diese Werte zu schaffen und sie im Eigenschaftenraster anzuzeigen. Allerdings möchte ich auch alle Standardeigenschaften zeigen, die gezeigt hätte sonst, wenn die PropertyGrid durch Reflexion bevölkert war eher als meine Überschreibung ICustomTypeDescriptor.GetProperties Methode.

Jetzt weiß ich, wie die Art des Objekts zu erhalten, und dann GetProperties(), aber das gibt einen Array von PropertyInfo nicht ProperyDescriptor. Also, wie kann ich das PropertyInfo Objekt des Typs in PropertyDescriptor Objekte enthält in meine Sammlung mit dem benutzerdefinierten PropertyDescriptors umwandeln?

//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);
War es hilfreich?

Lösung

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType);

Als Nebenwirkung. Wird dies nicht Ihre ICustomTypeDescriptor Anpassungen umfassen, aber es wird sind keine Anpassungen über TypeDescriptionProvider gemacht

(edit) Als eine zweite Seite - Sie können auch PropertyGrid optimieren, indem eine TypeConverter Bereitstellung - viel einfacher als entweder ICustomTypeDescriptor oder TypeDescriptionProvider - zum Beispiel:

[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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top