Propriedades de dependência somente leitura

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

Pré-requisitos

Este tópico pressupõe que você compreenda os cenários básicos de implementar 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 propriedade de dependência para ver o contexto.

Propriedades de dependência somente leitura existentes

Algumas das propriedades de dependência definidas na estrutura do Windows Presentation Foundation (WPF) são somente leitura. A razão típica para especificar uma propriedade de dependência somente leitura é que elas são propriedades que devem ser usadas para determinação do estado, mas quando esse estado é influenciado por uma variedade de fatores. No entanto, apenas configurar a propriedade para esse estado não é desejável de uma perspectiva de design de interface do usuário. Por exemplo, a propriedade IsMouseOver é realmente apenas o estado de afloramento, conforme determinado a partir da entrada do mouse. Qualquer tentativa de definir esse valor de maneira programática evitando a entrada de mouse verdadeira seria imprevisível e poderia causar inconsistência.

Em virtude de não ser configurável, propriedades de dependência somente leitura não são adequadas para muitos dos cenários para os quais as propriedades de dependência normalmente oferecem uma solução (por exemplo, vinculação de dados, estilizável diretamente para um valor, validação, animação, herança). Apesar de não serem configuráveis, as propriedades de dependência somente leitura ainda têm alguns recursos adicionais com suporte de 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 gatilho de propriedade em um estilo. Não é possível habilitar gatilhos com uma propriedade CLR (Common Language Runtime) normal; ela precisa ser uma propriedade de dependência. A propriedade acima mencionada IsMouseOver é um exemplo perfeito de um cenário em que pode ser bastante útil definir um estilo para um controle, onde alguma propriedade visível, como plano de fundo, primeiro plano ou propriedades semelhantes de elementos compostos dentro do controle será alterada quando o usuário colocar o mouse sobre alguma região definida do seu controle. Alterações em uma propriedade de dependência somente leitura também podem ser detectadas e relatadas pelos processos de invalidação inerentes do sistema de propriedades e isso na verdade dá suporte à funcionalidade de gatilho de propriedade internamente.

Criando propriedades de dependência somente leitura personalizadas

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

Grande parte do processo de criar uma propriedade de dependência somente leitura é igual ao processo descrito nos tópicos Propriedades de dependência personalizadas e Implementar uma propriedade de dependência. Há três diferenças importantes:

  • Ao registrar seu imóvel, chame o RegisterReadOnly método em vez do método normal Register para o registro do imóvel.

  • Ao implementar a propriedade "wrapper" CLR, certifique-se de que o wrapper também não tenha uma implementação definida, para que não haja inconsistência no estado somente leitura para o wrapper público exposto.

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

Qualquer valor ou campo particular que você tiver como suporte para sua propriedade de dependência somente leitura pode ser totalmente gravável usando qualquer lógica que você decidir. No entanto, a maneira mais direta de definir a propriedade inicialmente ou como parte da lógica de tempo de execução é usar as APIs do sistema de propriedades, em vez de contornar o sistema de propriedades e definir o campo de suporte 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 desejar definir o DependencyPropertyKey acesso no criado quando você registrou a propriedade de dependência pela primeira vez. Se manipular toda essa lógica dentro da classe, você pode torná-la particular ou, se exigir que ela seja definida de outras partes do assembly, 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 é vincular propriedades de dependência usando retornos de chamada e emparelhados PropertyChangedCallbackCoerceValueCallback como parte dos metadados dessas propriedades durante o registro.

Como o DependencyPropertyKey é privado e não é propagado pelo sistema de propriedades fora do código, uma propriedade de dependência somente leitura tem melhor segurança de configuração do que uma propriedade de dependência de leitura-gravação. Para uma propriedade de dependência de leitura/gravação, o campo de identificação é implicitamente ou explicitamente público e, portanto, a propriedade é amplamente configurável. Para obter informações mais específicas, consulte Segurança das propriedades de dependência.

Confira também