Compartilhar via


Propriedades de dependência do Read-Only

Este tópico descreve as propriedades de dependência somente leitura, incluindo as propriedades de dependência somente leitura existentes e os cenários e técnicas para criar uma propriedade de dependência somente leitura personalizada.

Pré-requisitos

Este tópico pressupõe que você entenda os cenários básicos de implementação de uma propriedade de dependência e como os metadados são aplicados a uma propriedade de dependência personalizada. Consulte Propriedades de dependência personalizadas e Metadados de propriedades de dependência para obter contexto.

Propriedades de dependência de Read-Only existentes

Algumas das propriedades de dependência definidas na estrutura do WPF (Windows Presentation Foundation) são somente leitura. O motivo típico para especificar uma propriedade de dependência somente leitura é que essas propriedades devem ser usadas para determinação de estado. No entanto, esse estado é influenciado por diversos fatores e, portanto, não é desejável definir a propriedade diretamente nesse estado sob uma perspectiva de design de interface do usuário. Por exemplo, a propriedade IsMouseOver está realmente apenas exibindo o estado conforme determinado pela entrada do mouse. Qualquer tentativa de definir esse valor programaticamente contornando a entrada verdadeira do mouse seria imprevisível e causaria inconsistência.

Em virtude de não serem configuráveis, as propriedades de dependência somente leitura não são apropriadas para muitos dos cenários para os quais as propriedades de dependência normalmente oferecem uma solução (ou seja: associação de dados, diretamente estilizável a um valor, validação, animação, herança). Apesar de não serem ajustáveis, as propriedades de dependência somente leitura ainda possuem algumas das capacidades adicionais suportadas pelas propriedades de dependência no sistema de propriedades. A capacidade restante mais importante é que a propriedade de dependência somente leitura ainda pode ser usada como um disparador de propriedade em um estilo. Você não pode habilitar gatilhos com uma propriedade CLR (Common Language Runtime) normal; precisa ser uma propriedade de dependência. A propriedade IsMouseOver acima mencionada é um exemplo perfeito de um cenário em que pode ser bastante útil definir um estilo para um controle, em que alguma propriedade visível, como um plano de fundo, primeiro plano ou propriedades semelhantes de elementos compostos dentro do controle, será alterada quando o usuário colocar um mouse sobre alguma região definida do seu controle. Alterações em uma propriedade de dependência somente de leitura também podem ser detectadas e relatadas pelos processos de invalidação inerentes do sistema de propriedades, e isso, de fato, dá suporte à funcionalidade de gatilho de propriedades internamente.

Criando Propriedades de Dependência Read-Only Personalizadas

Certifique-se de ler a seção acima sobre por que propriedades de dependência de somente leitura não funcionam em muitos cenários típicos de propriedades de dependência. Mas se você tiver um cenário apropriado, talvez queira criar sua própria propriedade de dependência somente leitura.

Grande parte do processo de criação de uma propriedade de dependência somente leitura é o mesmo que é descrito nos tópicos Propriedades de Dependência Personalizadas e Implementar uma Propriedade de Dependência. Há três diferenças importantes:

  • Ao registrar sua propriedade, chame o método RegisterReadOnly em vez do método Register normal para registro de propriedade.

  • Ao implementar a propriedade "wrapper" clr, verifique se o wrapper também não tem uma implementação definida, de modo que não haja inconsistência no estado somente leitura para o wrapper público que você expõe.

  • O objeto retornado pelo registro somente leitura é DependencyPropertyKey em vez de DependencyProperty. Você ainda deve armazenar esse campo como um membro, mas normalmente não o tornaria um membro público do tipo.

Seja qual for o campo ou valor privado que dá suporte à sua propriedade de dependência apenas para leitura, é claro que pode ser totalmente gravável usando qualquer lógica que você escolher. No entanto, a maneira mais simples de definir a propriedade inicialmente ou como parte da lógica de runtime é usar as APIs do sistema de propriedades, em vez de contornar o sistema de propriedades e definir o campo de backup privado diretamente. Em particular, há uma assinatura de SetValue que aceita um parâmetro do tipo DependencyPropertyKey. Como e onde você define esse valor programaticamente dentro da lógica do aplicativo afetará como você pode querer definir o acesso no DependencyPropertyKey criado quando você registrou pela primeira vez a propriedade de dependência. Se você manipular essa lógica toda dentro da classe, poderá torná-la privada ou, se exigir que ela seja definida de outras partes da montagem, poderá defini-la como interna. Uma abordagem é chamar SetValue dentro de um manipulador de eventos de classe de um evento relevante que informa a uma instância de classe que o valor da propriedade armazenada precisa ser alterado. Outra abordagem é associar propriedades de dependência juntas usando retornos de chamada emparelhados PropertyChangedCallback e CoerceValueCallback como parte dos metadados dessas propriedades no registro.

Como o DependencyPropertyKey é privado e não é propagado pelo sistema de propriedades fora do seu código, uma propriedade dependente somente leitura tem maior segurança na configuração do que uma propriedade dependente de leitura/gravação. Para uma propriedade de dependência de leitura/gravação, o campo de identificação é explicitamente ou implicitamente público e, portanto, a propriedade é amplamente definível. Para obter mais detalhes, consulte Segurança de Propriedade de Dependência.

Consulte também