Partilhar via


Read-Only Propriedades de dependência

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 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 de propriedades de dependência personalizadas e de metadados de propriedade de dependência para obter o contexto.

Propriedades de dependência de Read-Only 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 devem ser utilizadas para determinar o estado, porém esse estado é influenciado por múltiplos fatores. Apenas ajustar a propriedade para esse estado não é ideal do ponto de vista do design da interface do utilizador. Por exemplo, a propriedade IsMouseOver é realmente apenas estado de superfície conforme determinado a partir da 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 (a saber: vinculação de dados, diretamente estilizável 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 dos recursos adicionais suportados pelas propriedades de dependência no sistema de propriedades. A capacidade restante mais importante é que a propriedade de dependência de somente leitura ainda pode ser usada como um disparador de propriedade em um estilo. Não é possível 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 onde 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, mudará quando o usuário colocar o mouse sobre alguma região definida do seu controle. As alterações numa propriedade de dependência somente leitura também podem ser detectadas e relatadas pelos processos de invalidação inerentes ao sistema de propriedades, e isso, na realidade, suporta a funcionalidade de gatilho de propriedade internamente.

Criação de propriedades de dependência personalizadas Read-Only

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 você tiver um cenário apropriado, talvez queira criar sua própria propriedade de dependência somente leitura.

A maior parte do processo de criação de uma propriedade de dependência somente leitura é conforme descrito nos tópicos Propriedades de Dependência Personalizadas e Implementar uma Propriedade de Dependência. Existem três diferenças importantes:

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

  • Ao implementar a propriedade "wrapper" do 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 membro, mas normalmente não o tornaria um membro público do tipo.

Qualquer campo privado ou valor que suporte a sua propriedade de dependência de leitura somente, pode ser, naturalmente, totalmente modificável utilizando qualquer lógica que decidir. No entanto, a maneira mais simples 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 querer definir o acesso no DependencyPropertyKey criado quando você registrou a propriedade de dependência pela primeira vez. Se você manipular essa lógica toda dentro da classe, poderá torná-la privada ou, se precisar que ela seja definida a partir de outras partes do assembly, poderá defini-la internamente. Uma abordagem é chamar SetValue dentro de um manipulador de eventos de classe de um evento relevante que informa 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 emparelhados PropertyChangedCallback e CoerceValueCallback como parte dos metadados dessas propriedades durante o registro.

Como o DependencyPropertyKey é privado e não é propagado pelo sistema de propriedades fora do seu código, uma propriedade de dependência de leitura apenas oferece melhor segurança na configuração do que uma propriedade de dependência de leitura e gravação. Para uma propriedade de dependência de leitura-gravação, o campo de identificação é explícita ou implicitamente público e, portanto, a propriedade é amplamente configurável. Para obter mais detalhes, consulte Dependency Property Security.

Ver também