Pregunta

Tengo un conjunto de PropertyDescriptor personalizado que también quiero agregar categorías para que se muestren de forma más organizada en un PropertyGrid. Quiero que cada tipo de PropertyDescriptor vaya a una categoría específica.

He intentado usar TypeDescriptor.AddAttributes () para agregar atributos a un PropertyDescriptor existente, pero no se agrega el atributo de categoría.

CategoryAttribute intrinsicPropertyCategory = new CategoryAttribute("Intrinsic Properties");
currentDescriptor = new IntrinsicPropertyDescriptor(def);
TypeDescriptor.AddAttributes(currentDescriptor, new Attribute[] { intrinsicPropertyCategory });

También he intentado usar TypeDescriptor.AddAttributes () en el constructor para uno de mis PropertyDescriptors como se muestra a continuación. Pero tampoco funciona.

public IntrinsicPropertyDescriptor(IntrinsicPropertyDef propDef): base(propDef.Key, propDef.Attributes)
{
this._type = propDef.Type;
this._key = propDef.Key;
this._readOnly = propDef.ReadOnly;

CategoryAttribute intrinsicPropertyCategory = new CategoryAttribute("Intrinsic Properties");
TypeDescriptor.AddAttributes(this, new Attribute[] { intrinsicPropertyCategory });
}

Preferiría no pasar el tiempo explicando por qué hago lo que hago. Pero en el ejemplo anterior, IntrinsicPropertyDef es una clase que define una propiedad que incluye un Nombre, Nombre para mostrar y Tipo. Así que propDef.Attributes incluye el DisplayNameAttribute.

Un IntrinsicPropertyDef se puede mostrar con dos PropertyDescriptors personalizados, CustomIndividorsPropertyDescriptor, e InferedIntrinsicPropertyDescriptor. Cada IntrinsicPropertyDescriptor debe tener un atributo de categoría " Propiedades intrínsecas " y cada InferedIntrinsicPropertyDescriptor debe tener un atributo de categoría " Inferred Intrinsic Properties " ;.

¿Fue útil?

Solución

Yo creo simplemente puede anular la Categoría :

public override string Category { get {return "Foo";}}

Para otros escenarios; en general, con un PropertyDescriptor personalizado, especifique los atributos en el constructor. Deberá expandir el argumento Attribute [] para incluir el CategoryAttribute . Si necesita realizar algún procesamiento, puede utilizar un método estático, sin probar:

static Attribute[] AddCategory(Attribute[] attributes, string category) {
    Array.Resize(ref attributes, attributes.Length + 1);
    attributes[attributes.Length - 1] = new CategoryAttribute(category);
    return attributes;
}
public IntrinsicPropertyDescriptor(IntrinsicPropertyDef propDef)
     : base(propDef.Key, AddCategory(propDef.Attributes, "Foo"))
{...}

También: tenga en cuenta que para que se utilice un PropertyDescriptor , el sistema debe encontrarlo ... las reglas de resolución son:

  • para PropertyGrid , el TypeConverter proporciona las propiedades, por defecto a las propiedades de una instancia (a continuación)
  • para una instancia:
    • ICustomTypeDescriptor está marcado
    • de lo contrario, busca un TypeDescriptionProvider registrado para la instancia o tipo
    • de lo contrario se utiliza la reflexión
  • para un tipo:
    • busca un TypeDescriptionProvider registrado para el tipo
    • de lo contrario se utiliza la reflexión
  • para listas:
    • IListSource se comprueba y se resuelve en una lista (el proceso continúa)
    • ITypedList está marcado
    • de lo contrario, el tipo de lista se comprueba para un indizador sin objeto, es decir, public SomeType this [int index] {get;}
      • si se encuentra, se utilizan las propiedades para el tipo SomeType , como se definió anteriormente
    • de lo contrario, si la lista no está vacía, se utilizan las propiedades de la primera instancia ( list [0] ), tal como se definió anteriormente
    • de lo contrario, los metadatos no están disponibles
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top