2011-01-14 9 views
13


¿Hay alguna manera de hacer que un atributo "Examinable" sea condicional, por lo que la propiedad que lo aplica aparecerá algunas veces en la página de propiedades y otras no?
gracias :)Atributo "Navegable" condicional

Respuesta

7

No hay una manera fácil.

Posiblemente pueda resolver esto implementando ICustomTypeDescriptor. Aquí hay un buen artículo sobre implementing ICustomTypeDescriptor.

O puede asociar su propio ControlDesigner con su clase y anular el método PreFilterProperties para agregar o eliminar propiedades vistas en la cuadrícula de propiedades.

Removing certain properties from property grid.

+2

el enlace para implementar ICustomTypeDescriptor.got señaló a https://msdn.microsoft.com/magazine/msdn-magazine-issues Creo que han eliminado la página original – gg89

6

Puede hacerlo proporcionando un modelo de tipo personalizado; en el nivel más simple, puede proporcionar un TypeDescriptor personalizado para su tipo derivado de ExpandableObjectConverter, y simplemente incluir/excluir la propiedad dada a capricho, pero esto solo funciona con PropertyGrid - utilizado por la página de propiedades. Un enfoque más complejo es usar ICustomTypeDescriptor/TypeDescriptionProvider - esto puede funcionar en cosas como DataGridView

0

me encontré con esto en busca de una forma de declarar ciertos miembros visible o escondido en IntelliSense y ser capaz de cambiar una vez por todas que necesitaba ser escondido en tiempo de compilación. No puedo decir si eso es lo que estabas buscando o no, pero encontré una respuesta a mi pregunta ... pensé que no estaría de más compartir.

puse un símbolo condicional compilación (que se encuentra en el separador Crear de propiedades del proyecto) IS_VIS (valor de ser cierto si desea que ciertos miembros para mostrar, falsa si su falta de ocultarlas) y luego:

#if IS_VIS 
    public const System.ComponentModel.EditorBrowsableState isVis = 
     ComponentModel.EditorBrowsableState.Always; 
#else 
    public const System.ComponentModel.EditorBrowsableState isVis = 
     ComponentModel.EditorBrowsableState.Never; 
#endif 

a continuación referencia a la variable isVis en el atributo:

[EditorBrowsable(isVis)] 
public string myMethod... 

hice esto en VB y esto fue convertido a toda prisa a C#. Si algo no funciona bien, házmelo saber.

8

No estoy seguro de que esto se aplique a su situación, pero puede ajustar la decoración de "Navegable" en tiempo de ejecución llamando a la función a continuación.

/// <summary> 
/// Set the Browsable property. 
/// NOTE: Be sure to decorate the property with [Browsable(true)] 
/// </summary> 
/// <param name="PropertyName">Name of the variable</param> 
/// <param name="bIsBrowsable">Browsable Value</param> 
private void setBrowsableProperty(string strPropertyName, bool bIsBrowsable) 
{ 
    // Get the Descriptor's Properties 
    PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(this.GetType())[strPropertyName]; 

    // Get the Descriptor's "Browsable" Attribute 
    BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)]; 
    FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance); 

    // Set the Descriptor's "Browsable" Attribute 
    isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable); 
} 
+0

Hola. Estoy buscando algo como esto. Cuando uso su código, obtengo una excepción nullValue en la primera línea 'PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties (this.GetType()) [strPropertyName];'.Quiero saber dónde colocar estas funciones y cómo se refleja en la cuadrícula de propiedades (no vi un objeto propertyGrid en la función). –

+1

Muchas gracias por su solución, cambié la línea a 'PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties (vObject.GetType()) [strPropertyName];', donde vObject es el objeto que estoy alterando. –

0

Como una mejora en la respuesta de @ neoikon arriba y para evitar la excepción Ganesh menciona en los comentarios, aquí es una versión que utiliza los genéricos para obtener el tipo:

/// <summary> 
    /// Set the Browsable property. 
    /// NOTE: Be sure to decorate the property with [Browsable(true)] 
    /// </summary> 
    /// <param name="PropertyName">Name of the variable</param> 
    /// <param name="bIsBrowsable">Browsable Value</param> 
    private void SetBrowsableProperty<T>(string strPropertyName, bool bIsBrowsable) 
    { 
     // Get the Descriptor's Properties 
     PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(typeof(T))[strPropertyName]; 

     // Get the Descriptor's "Browsable" Attribute 
     BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)]; 
     FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance); 

     // Set the Descriptor's "Browsable" Attribute 
     isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable); 
    } 

A continuación, puede añadir también una versión que toma una instancia:

/// <summary> 
    /// Set the Browsable property. 
    /// NOTE: Be sure to decorate the property with [Browsable(true)] 
    /// </summary> 
    /// <param name="obj">An instance of the object whose property should be modified.</param> 
    /// <param name="PropertyName">Name of the variable</param> 
    /// <param name="bIsBrowsable">Browsable Value</param> 
    private void SetBrowsableProperty<T>(T obj, string strPropertyName, bool bIsBrowsable) 
    { 
     SetBrowsableProperty<T>(strPropertyName, bIsBrowsable); 
    } 

Uso:

class Foo 
    { 
     [Browsable(false)] 
     public string Bar { get; set; } 
    } 
    void Example() 
    { 
     SetBrowsableProperty<Foo>("Bar", true); 
     Foo foo = new Foo(); 
     SetBrowsableProperty(foo, "Bar", false); 
    } 
Cuestiones relacionadas