Agregar un atributo de categoría a un PropertyDescriptor
-
05-07-2019 - |
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 " ;.
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
, elTypeConverter
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
- busca un
- 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
- si se encuentra, se utilizan las propiedades para el tipo
- 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
-