Pergunta

Sigh, outra questão PropertyGrid. Eu pensei que eu poderia contornar isso até que eu corri em um problema onde eu não poderia realmente evitá-lo.

Eu tenho uma propriedade booleana que às vezes precisa ser somente leitura e às vezes precisa ser mutável, dependendo do objeto selecionado de um TreeView.

A minha pergunta é como posso mudar a ReadOnlyAttribute de uma propriedade dinamicamente? Obviamente, a criação de uma variável booleana e depois tentar defini-lo como ReadOnlyAttribute (Boolvar) não funciona e agora estou sem ideias.

A única solução que eu posso pensar é a criação de classes separadas, quase idênticas para os itens onde esta propriedade é gravável e um para somente leitura, mas isso parece um unelegant pouco para mim.

Ajuda? :)

Foi útil?

Solução

O que eu gostaria de fazer é criar uma classe base com uma versão protegida a propriedade, em seguida, criar duas classes que herdam da classe base que têm o somente leitura e os bits não somente leitura.

Outras dicas

Você pode fornecer informações dinâmicas sobre as propriedades de uma classe a uma grade de propriedade através da implementação de ICustomTypeDescriptor .

A grade de propriedade irá chamar ICustomTypeDescriptor.GetProperties () você retorna uma coleção de objetos derivados de PropertyDescriptors . Em sua implementação você pode substituir o PropertyDescriptor.IsReadOnly propriedade e implementar sua lógica.

Este é um pouco de trabalho, em primeiro lugar, mas dá-lhe a possibilidade de devolver dinamicamente um nome de propriedade e uma descrição (útil para a localização), dinamicamente propriedades marca como somente leitura, dynamiclly mostrar e ocultar propriedades, e fazer um monte de outras coisas uteis.

Você poderia tentar algo nesse sentido para evitar a conversão de tipo envolvido com múltiplas classes:

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