Segurança de propriedade da dependência

As propriedades da dependência geralmente devem ser consideradas como propriedades públicas. A natureza do sistema de propriedades do Windows Presentation Foundation (WPF) impede a capacidade de fazer garantias de segurança sobre um valor de propriedade de dependência.

Acesso e segurança de Wrappers e propriedades de dependência

Normalmente, as propriedades de dependência são implementadas junto com as propriedades CLR (Common Language Runtime) "wrapper" que simplificam a obtenção ou a configuração da propriedade de uma instância. Mas os wrappers são realmente apenas métodos de conveniência que implementam as chamadas subjacentes GetValue e SetValue estáticas que são usadas ao interagir com propriedades de dependência. Pensando nisso de outra maneira, as propriedades são expostas como propriedades CLR (Common Language Runtime) que são apoiadas por uma propriedade de dependência em vez de por um campo privado. Mecanismos de segurança aplicados aos wrappers não são paralelo ao comportamento do sistema de propriedade e acesso da propriedade de dependência subjacente. Colocar uma demanda de segurança no invólucro apenas impedirá o uso do método de conveniência, mas não impedirá chamadas para GetValue ou SetValue. Da mesma forma, impor um nível de acesso protegido ou privado aos wrappers não oferece nenhuma segurança efetiva.

Se você estiver escrevendo suas próprias propriedades de dependência, deverá declarar os wrappers e o campo identificador como membros públicos, para que os chamadores não obtenham informações enganosas sobre o DependencyProperty verdadeiro nível de acesso dessa propriedade (devido ao seu armazenamento ser implementado como uma propriedade de dependência).

Para uma propriedade de dependência personalizada, você pode registrar sua propriedade como uma propriedade de dependência somente leitura, e isso fornece um meio eficaz de impedir que uma propriedade seja definida por qualquer pessoa que não tenha uma referência à DependencyPropertyKey para essa propriedade. Para obter mais informações, consulte Propriedades de dependência somente leitura.

Observação

Declarar um DependencyProperty campo identificador privado não é proibido e ele pode ser usado para ajudar a reduzir o namespace imediatamente exposto de uma classe personalizada, mas tal propriedade não deve ser considerada "privada" no mesmo sentido que as definições de linguagem CLR (Common Language Runtime) definem esse nível de acesso, por motivos descritos na próxima seção.

Exposição do sistema de propriedades das propriedades de dependência

Em geral, não é útil, e é potencialmente enganoso, declarar um como qualquer nível de DependencyProperty acesso que não seja público. Essa configuração de nível de acesso só impede que alguém possa obter uma referência à instância da classe declarante. Mas há vários aspectos do sistema de propriedades que retornarão um DependencyProperty como o meio de identificar uma propriedade específica como ela existe em uma instância de uma classe ou uma instância de classe derivada, e esse identificador ainda é utilizável em uma SetValue chamada mesmo se o identificador estático original for declarado como não público. Além disso, OnPropertyChanged os métodos virtuais recebem informações de qualquer propriedade de dependência existente que alterou o valor. Além disso, o GetLocalValueEnumerator método retorna identificadores para qualquer propriedade em instâncias com um valor definido localmente.

Validação e segurança

Aplicar uma demanda a uma e esperar a falha de validação em uma falha de demanda para impedir que uma ValidateValueCallback propriedade seja definida não é um mecanismo de segurança adequado. A invalidação de valor definido imposta por meio também pode ser suprimida por ValidateValueCallback chamadores mal-intencionados, se esses chamadores estiverem operando no domínio do aplicativo.

Confira também