Pregunta

Suspiro, otra pregunta de PropertyGrid. Pensé que podría solucionar esto hasta que me encontrase con un problema en el que no pudiera evitarlo.

Tengo una propiedad booleana que a veces debe ser de solo lectura y a veces debe ser modificable según el objeto seleccionado de un TreeView.

Mi pregunta es ¿cómo puedo cambiar dinámicamente el atributo ReadOnlyAttribute de una propiedad? Obviamente, crear una variable booleana y luego intentar establecerla como ReadOnlyAttribute (boolVar) no funciona y ahora me quedo sin ideas.

La única solución que se me ocurre es crear clases separadas, casi idénticas para los elementos en los que esta propiedad se puede escribir y otra para solo lectura, pero esto me parece un poco poco elegante.

Ayuda? :)

¿Fue útil?

Solución

Lo que haría es crear una clase base con una versión protegida de la propiedad, luego crear dos clases que hereden la clase base que tenga los bits de solo lectura y los de no solo lectura.

Otros consejos

Puede proporcionar información dinámica sobre las propiedades de una clase a una cuadrícula de propiedades implementando ICustomTypeDescriptor .

La cuadrícula de propiedades llamará a ICustomTypeDescriptor.GetProperties () y devuelve una colección de objetos derivados de PropertyDescriptors . En su implementación, puede anular el PropertyDescriptor.IsReadOnly propiedad e implementa tu lógica.

Esto es bastante trabajo en primer lugar, pero le brinda la posibilidad de devolver dinámicamente un nombre y descripción de propiedad (útil para la localización), marcar dinámicamente propiedades como solo lectura, mostrar y ocultar dinámicamente propiedades, y hacer muchas otras cosas útiles.

Podría intentar algo en este sentido para evitar la conversión de tipos involucrada con varias clases:

class TestClass
{
    private bool isMyPropertyReadOnly;

    public bool IsMyPropertyReadOnly
    {
        get { return isMyPropertyReadOnly; }
        set { isMyPropertyReadOnly = value; }
    }

    private int myVar;

    public int MyProperty
    {
        get { return myVar; }

        set
        {
            if (isMyPropertyReadOnly)
            {
                throw new System.Exception("The MyProperty property is read-only.");
            }
            else
            {
                myVar = value;
            }
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top