PropertyGrid - Dinamicamente mudando ReadOnlyAttribute
-
10-07-2019 - |
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? :)
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;
}
}
}
}