Pergunta

Eu estou personalizando como um tipo de objeto é exibido em uma PropertyGrid através da implementação de ICustomTypeDescriptor. Eu estou permitindo que o usuário crie suas próprias propriedades personalizadas que são armazenadas em um único dicionário de chaves e valores. Eu sou capaz de criar todo o PropertyDescriptors para estes valores e visualizá-los na grade de propriedade. No entanto, eu também quero mostrar todas as propriedades padrão que de outra forma teria mostrado se o PropertyGrid foi povoada por meio de reflexão, em vez do meu método de substituição ICustomTypeDescriptor.GetProperties.

Agora eu sei como obter o tipo do objeto, e GetProperties() então, mas este retorna uma matriz de não PropertyInfo ProperyDescriptor. Então, como posso converter o objeto PropertyInfo do tipo em PropertyDescriptor objetos para incluir na minha coleção com o PropertyDescriptors personalizado?

//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);
Foi útil?

Solução

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(thisType);

Como um aparte: este não irá incluir suas personalizações ICustomTypeDescriptor, mas irá inclui quaisquer personalizações feitas via TypeDescriptionProvider

.

(edit) Como um segundo lado - você pode PropertyGrid também beliscão, fornecendo uma TypeConverter - muito mais simples do que qualquer ICustomTypeDescriptor ou TypeDescriptionProvider - por exemplo:

[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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top