Metadados de Propriedade de Dependência
O sistema de propriedade Windows Presentation Foundation (WPF) incluem um sistema de reportagem de metadados que vai além do que pode ser reportado sobre uma propriedade por meio de reflexão ou características common language runtime (CLR) gerais. Metadados para uma propriedade de dependência pode também ser designada unicamente pela classe que define uma propriedade de dependência, pode ser modificada quando a propriedade de dependência é adicionada a uma classe diferente, e pode ser substituída especificamente por todas classes derivadas classes que herdam a propriedade de dependência da classe base que a define.
Este tópico contém as seguintes seções.
- Pré-requisitos
- Como Metadados de Propriedade de Dependência são Usados
- APIs de metadados
- Quando a substituir os metadados, quando a Derive uma classe
- Cenários de alteração de metadados existentes
- Tópicos relacionados
Pré-requisitos
Este tópico assume que você entende propriedades de dependência de uma perspectiva de um consumidor de propriedades de dependência existentes em classes Windows Presentation Foundation (WPF) , e já leu Visão geral sobre propriedades de dependência. Para que você siga os exemplos deste tópico, você também deve entender XAML e saber como escrever aplicações WPF.
Como Metadados de Propriedade de Dependência são Usados
Metadados de propriedade de dependência existem como um objeto que pode ser requisitado para examinar as características de uma propriedade de dependência. Estes metadados também são acessados frequentemente pelo sistema de propriedades enquanto ele processa qualquer propriedade de dependência dada. O objeto de metadados para uma propriedade de dependência pode conter os seguintes tipos de informação:
Valor da propriedade de dependência padrão se nenhum Outros valor pode ser determinado para a propriedade de dependência pelo valor local, estilos, herança, etc. Para uma discussão detalhada de como os valores padrão participam a precedência usada pelo sistema de propriedade ao atribuir valores para propriedades de dependência, consulte Precedência de valores de propriedade de dependência.
Referência para implementações de callback que afetam a coerção ou modificam o comportamento de notificação de mudança por dono-tipo. Note que esses callbacks são frequentemente definidos com um nível de acesso não público, então obter as referências a partir dos metadados geralmente não são possíveis a não ser que as referências estão dentro do seu escopo de acesso permitido. Para mais informações sobre callbacks de propriedades de dependência, consulte Validação e Callbacks de Propriedade de Dependência.
Se a propriedade de dependência em questão é considerada como uma propriedade em nível de Framework WPF , os metadados podem conter características de propriedades de dependência em nível de Framework WPF, cujas informações de relatório e estados de serviço como o mecanismo de layout em nível de Framework WPF e a lógica de herança de propriedades. Para mais informações sobre este aspecto de metadados de propriedades de dependência, consulte Metadados de Propriedades de Framework.
APIs de metadados
O tipo que reporta a maioria das informações de metadados usados pelo sistema de propriedades é a classe PropertyMetadata. Instâncias de metadados são opcionalmente especificadas quando propriedades de dependência são registradas com o sistema de propriedades, e podem ser especificadas novamente para tipos adicionais que tanto adicionam-se como donos ou substituem metadados que herdam da definição da propriedade de dependência da classe base. (Para casos onde o registro da propriedade não especifica metadados, um PropertyMetadata padrão é criado com valores padrões para aquela classe.) Os metadados registrados são retornados como PropertyMetadata quando você chama os vários sobrecarregamentos GetMetadata que pegam metadados de uma propriedade de dependência de uma instância de DependencyObject.
The PropertyMetadata classe é derivada para fornecer metadados mais específicos para divisões de arquiteturais sistema autônomo o Nível de estrutura do WPF classes. UIPropertyMetadata Adiciona a emissão de relatórios de animação, e FrameworkPropertyMetadata Fornece o Nível de estrutura do WPF propriedades mencionadas na seção anterior. Quando propriedades de dependência são registradas, elas podem ser registradas com essas classes PropertyMetadata derivadas. Quando os metadados são examinados, o tipo base PropertyMetadata pode potencialmente ser convertido para as classes derivadas de modo que você possa examinar as propriedades mais específicas.
Observação: |
---|
As características de propriedade que podem ser especificadas em FrameworkPropertyMetadataàs vezes, são chamados nesta documentação sistema autônomo "sinalizadores". Quando você cria novas instâncias de metadados para uso em registros de propriedade de dependência ou substituição de metadados, você especifica esses valores usando a enumeração FrameworkPropertyMetadataOptions sinalizadora e, em seguida, você fornece valores de enumeração possivelmente concatenados para o construtor FrameworkPropertyMetadata. No entanto, uma vez construído, essas características são expostas em um FrameworkPropertyMetadata como uma série de propriedades booleanas vez do valor de construir enumeração opção. Propriedades booleanas permitem que você verifique cada condicional, em vez de exigir que você aplicar uma máscara em um valor de enumeração flagwise para obter as informações sobre quais está interessado. O construtor usa o concatenados FrameworkPropertyMetadataOptions para manter o comprimento da assinatura de construtor razoável, enquanto os metadados construído real expõe as propriedades distintas para tornar a consultar os metadados mais intuitivo. |
Quando a substituir os metadados, quando a Derive uma classe
O sistema a propriedade WPF estabeleceu recursos para alterar algumas características das propriedades de dependência sem exigir que eles sejam totalmente reimplementadas. Isso é conseguido construindo uma instância diferente dos metadados de propriedade para a propriedade de dependência conforme ela existe em um tipo específico. Observe que a maioria das propriedades de dependência não são propriedades virtuais, assim estritamente falando "reimplementá"-las em Classes herdadas somente pode ser feito encobrindo o membro existente.
Se o cenário que você está tentando habilitar para um propriedade de dependência em um tipo não pode ser feito modificando as características das propriedades de dependência existente, então talvez seja necessário criar uma classe derivada e, em seguida, declarar uma propriedade de dependência personalizada na sua classe derivada. Um propriedade de dependência personalizada se comporta de forma idêntica que propriedades de dependência definidas por WPF APIs. Para obter mais detalhes sobre propriedades personalizadas de dependência, consulte Propriedades de Dependência Personalizada.
Uma característica notável de uma propriedade de dependência que você não pode substituir é seu tipo de valor. Se você estiver herdando um propriedade de dependência que possui o comportamento próximo ao que você precisa, mas você requerem um tipo diferente para ele, você terá que implementar uma propriedade de dependência personalizada e talvez vincular as propriedades por meio de conversão de tipos ou outra implementação em sua classe personalizada. Além disso, não é possível substituir ValidateValueCallback existentes, porque esse retorno de chamada existe no registro de campo próprio e não nos seus metadados.
Cenários de alteração de metadados existentes
Se você estiver trabalhando com os metadados de um propriedade de dependência existente, um cenário comum para alterar os metadados de propriedade de dependência é alterar o valor padrão. Alterando ou adicionando retornos de chamada do sistema de propriedades é um cenário mais avançado. Convém fazer isso se sua implementação de uma classe derivada tem diferentes relações entre as propriedades de dependência. Uma das condições de um modelo de programação que ofereça suporte de código e de uso declarativo é que as propriedades devem funcionar sendo definidas em qualquer ordem. Portanto, quaisquer propriedade dependente precisará ser definida no momento certo sem-contexto e não podem depender em conhecer que uma ordem de definição como em um construtor. Para obter mais informações sobre esse aspecto do sistema propriedade, consulte Validação e Callbacks de Propriedade de Dependência. Observe que a validação de retornos de chamada não fazem parte de metadados; eles são parte do identificador de propriedade de dependência. Portanto, a validação de retornos de chamada não podem ser alterados substituindo os metadado.
Em alguns casos, também convém alterar as opções de metadados da propriedade WPF Framework-Nível de em propriedades de dependência existentes. Essas opções se comunicam determinadas condições conhecidas sobre propriedades em Nível WPF Framework para outros processos em Nível WPF Framework como o sistema de layout. Configurar as opções geralmente é feita apenas quando registrar uma nova propriedade de dependência, mas também é possível alterar os metadados de propriedade em Nível WPF Framework como parte de um OverrideMetadata ou chamada de AddOwner. Para obter os valores específicos para uso e obter mais informações, consulte Metadados de Propriedades de Framework. Para obter mais informações que são pertinentes à como essas opções devem ser definidas para uma propriedade de dependência recém-registrada, consulte Propriedades de Dependência Personalizada.
Substituindo os metadados
A finalidade de substituição de metadados é principalmente para que você tenha a oportunidade para alterar os vários comportamentos de metadados-derivadas que são aplicados ao propriedade de dependência conforme ela existe no seu tipo. As razões para isso são explicadas em mais detalhes na seção Metadata. Para obter mais informações incluindo alguns exemplos de código, consulte Como: Override Metadata for a Dependency Property.
Metadados de propriedade podem ser fornecidos para um propriedade de dependência durante a chamada de registro (Register). No entanto, em muitos casos, convém fornecer os metadados específicos do tipo de sua classe quando ela herda a propriedade de dependência. Você pode fazer isso chamando o método OverrideMetadata. Para obter um exemplo de WPF APIs, a classe FrameworkElement é o tipo que registra a propriedade de dependência Focusable pela primeira vez. Mas a classe Control substitui os metadados para a propriedade de dependência fornecer seu próprio valor inicial padrão, mudando de false para true, e caso contrário usar a implementação Focusable original.
Quando você substituir metadados, as características diferentes de metadados são mescladas ou substituídas.
PropertyChangedCallback é mesclado. Se você adicionar um novo PropertyChangedCallback, o retorno de chamada é armazenado nos metadados. Se você não especificar um PropertyChangedCallback em uma substituição, o valor de PropertyChangedCallback é promovido como uma referência a partir do predecessor mais próximo que o especificou nos metadados.
O comportamento do sistema real do PropertyChangedCallback é que as implementações de todos os proprietários de metadados na hierarquia são mantidos e adicionados a uma tabela, com ordem de execução pelo sistema de propriedade sendo que os retornos de chamada da classe mais derivada são chamados primeiro.
DefaultValue será substituída. Se você não especificar um PropertyChangedCallback em uma substituição, o valor de DefaultValue vem do predecessor mais próximo que o especificou nos metadados.
Implementações de CoerceValueCallback são substituídas. Se você adicionar um novo CoerceValueCallback, o retorno de chamada é armazenado nos metadados. Se você não especificar um CoerceValueCallback em uma substituição, o valor de CoerceValueCallback é promovido como uma referência a partir do predecessor mais próximo que o especificou nos metadados.
O comportamento do sistema de propriedades é que apenas o CoerceValueCallback nos metadados imediatos é invocado. Nenhuma referências a outras implementações CoerceValueCallback na hierarquia são mantidas.
Esse comportamento é implementado pelo Merge e pode ser substituído em classes derivadas de metadados.
Substituindo Propriedade metadados anexadas
Em WPF, propriedades anexas são implementadas como propriedades de dependência. Isso significa que eles também tem metadados de propriedade, que classes individuais podem substituir. As considerações de escopo para uma propriedade anexa no WPF são geralmente que qualquer DependencyObject pode ter uma propriedade anexada definida neles. Portanto, qualquer classe derivada de DependencyObject pode substituir os metadados para qualquer propriedade anexada, que pode ser definido em uma instância da classe. Você pode substituir os valores padrão, retornos de chamada ou propriedades de reportagem de características em nível do Framework WPF. Se a propriedade anexa for definida em uma instância de sua classe, aqueles características de metadados de propriedade substituídas são aplicáveis. Por exemplo, você pode substituir o valor padrão, de forma que o valor de substituição é relatado como o valor da propriedade anexado em instâncias da sua classe, sempre que a propriedade é não definida.
Observação: |
---|
O Inherits a propriedade não é relevante para propriedades anexadas. |
Adicionando uma classe como um proprietário de uma propriedade de dependência existente
Uma classe pode adicionar a si mesmo como um proprietário de uma propriedade de dependência que já tinha sido registrado, usando o método AddOwner. Isso permite que a classe para use um propriedade de dependência que foi registrado originalmente para um tipo diferente. A adição de classe não é normalmente uma classe derivada do tipo que registrou primeiro a propriedade de dependência como proprietário. Na verdade, isso permite que a classe e suas classes derivadas herdem uma implementação de propriedade de dependência sem que a classe do proprietário original e a classe sendo adicionada estarem na mesma hierarquia classe verdadeira de classe. Além disso, a adição de classe (e classes derivadas também) podem em seguida, fornecer os metadados específicos de tipo para o propriedade de dependência original.
Assim como se adicionar como proprietário por meio de métodos utilitário do sistema propriedade, a adição de classe deve declarar membros públicos próprios adicionais para tornar a propriedade de dependência um participante completo no sistema com a exposição em código e em marcação de propriedade. Uma classe que adiciona um propriedade de dependência existente tem as mesmas responsabilidades como expor o modelo de objeto da propriedade de dependência assim como uma classe que define uma nova propriedade de dependência personalizada. O primeiro membro a ser exposto é um campo de identificador de propriedade de dependência. Este campo deve ser um campopublic static readonly do tipo DependencyProperty, que é atribuído ao valor de retorno da chamada do AddOwner. O segundo membro para ser definido é a propriedade common language runtime (CLR) "wrapper". O wrapper torna muito mais conveniente manipular sua propriedade de dependência em código (você evita chamadas para SetValue cada vez e pode fazer essa chamada somente uma vez no wrapper próprio). O wrapper é implementado identicamente de como ele poderia ser implementado se você estivesse registrando uma propriedade de dependência personalizada. Para obter mais informações sobre como implementar uma propriedade de dependência , consulte Propriedades de Dependência Personalizada e Como: Add an Owner Type for a Dependency Property.
AddOwner e propriedades anexas
Você pode chamar AddOwner para uma propriedade de dependência que é definida como uma propriedade anexada pela classe do proprietário. Geralmente, a razão para fazer isso é expor a propriedade anexada anteriormente como uma propriedade de dependência não anexa. Você irá expor o valor de retorno do AddOwner como um campo public static readonly para ser usado como o identificador de propriedade de dependência e irá definir "wrapper" de propriedades apropriado para que a propriedade seja exibida na tabela de membros e suporte o uso de propriedades não anexas na sua classe.
Consulte também
Conceitos
Visão geral sobre propriedades de dependência
Metadados de Propriedades de Framework