Este artigo foi traduzido por máquina. Para visualizar o arquivo em inglês, marque a caixa de seleção Inglês. Você também pode exibir o texto Em inglês em uma janela pop-up, movendo o ponteiro do mouse sobre o texto.
Tradução
Inglês

Eventos de alteração de propriedade

 

Publicado: junho de 2016

Windows Presentation Foundation (WPF) define vários eventos que são gerados em resposta a uma alteração no valor de uma propriedade. Geralmente, a propriedade é um DependencyProperty. O evento propriamente dito é às vezes um eventos roteados e, às vezes, é um padrão CLR (Common Language Runtime) eventos. A definição do evento varia dependendo do cenário, porque algumas alterações de propriedades são mais adequadamente roteadas por meio de uma árvore de elemento, enquanto outras alterações de propriedades são geralmente somente de interesse para o objeto onde a propriedade alterada.

Nem todos os eventos que reportam uma alteração de propriedade são explicitamente identificados como um evento de propriedade alterada, em virtude de um padrão de assinatura ou um padrão de nomenclatura. Em geral, a descrição do evento no SDK (Software Development Kit) documentação indica se o evento está diretamente vinculado a uma alteração de valor de propriedade e fornece referências cruzadas entre a propriedade e evento.

Determinados eventos usam um tipo de dados de eventos e representante explicitamente usados para eventos de alteração de propriedade. O tipo de dados de evento é RoutedPropertyChangedEventArgs<T>, e o representante é RoutedPropertyChangedEventHandler<T>. Os dados do evento e representante têm um parâmetro de tipo genérico que é usado para especificar o tipo real da propriedade a alterar quando você define o manipulador. Os dados do evento contém duas propriedades, OldValue e NewValue, que são então passadas como o argumento de tipo no evento dados.

A parte "Roteada" do nome indica que o evento de propriedade alterada é registrado como um evento roteado. A vantagem de roteamento de um evento de propriedade alterada é que o nível superior de um controle pode receber eventos de propriedade alterada se as propriedades nos elementos filho (partes da composição do controle) alterar valores. Por exemplo, você pode criar um controle que incorpora um RangeBase controlar como um Slider. Se o valor de Value alterações de propriedade parte do controle deslizante, convém tratar essa alteração na controle pai em vez de na parte.

Como você tem um valor antigo e um novo valor, talvez seja tentador usar este manipulador de eventos como uma validação para o valor da propriedade. No entanto, isso não é a intenção do design da maioria dos eventos de propriedade alterada. Em geral, os valores são fornecidos para que você pode atuar nesses valores em outras áreas de lógica do seu código, mas, na verdade, alterando os valores de dentro do manipulador de eventos não é aconselhável e podem causar a recursão não intencional dependendo de como seu manipulador é implementado.

Se a propriedade for uma propriedade de dependência personalizada, ou se você estiver trabalhando com uma classe derivada onde você definiu o código de instanciação, há um mecanismo muito melhor para controlar alterações de propriedade interna para o WPF sistema de propriedade: os retornos de chamada do sistema de propriedade CoerceValueCallback e PropertyChangedCallback. Para obter mais detalhes sobre como você pode usar o WPF sistema de propriedade para validação e coerção, consulte Retornos de chamada de propriedade de dependência e validação e Propriedades de dependência personalizadas.

Outro par de tipos que fazem parte de um cenário de evento de alteração de propriedade é DependencyPropertyChangedEventArgs e DependencyPropertyChangedEventHandler. Eventos para essas alterações de propriedade não são roteados; eles são padrão CLR eventos. DependencyPropertyChangedEventArgs é um tipo de relatório porque ele não deriva de dados de eventos incomum EventArgs; DependencyPropertyChangedEventArgs é uma estrutura, não uma classe. 

Eventos que usam DependencyPropertyChangedEventArgs e DependencyPropertyChangedEventHandler são um pouco mais comuns que RoutedPropertyChanged eventos. Um exemplo de um evento que usa esses tipos é IsMouseCapturedChanged.

Como RoutedPropertyChangedEventArgs<T>, DependencyPropertyChangedEventArgs também relata um antigo e novo valor para a propriedade. Além disso, as mesmas considerações sobre o que é possível com os valores se aplicam; geralmente não é recomendável que você tente alterar os valores novamente no remetente em resposta ao evento.

Um conceito fortemente relacionado a um evento de propriedade alterada é um disparador de propriedade. Um disparador de propriedade é criado em um estilo ou modelo e permite que você crie um comportamento condicional com base no valor da propriedade onde o disparador de propriedade é atribuído.

A propriedade de um disparador de propriedade deve ser uma propriedade de dependência. Ele pode ser (e frequentemente é) uma propriedade de dependência somente leitura. Um bom indicador para quando uma propriedade de dependência exposta por um controle é pelo menos parcialmente projetada para ser um disparador de propriedade é se o nome da propriedade começa com "É". Propriedades que têm esse nomeação são geralmente uma propriedade booleana de dependência somente leitura onde o cenário principal para a propriedade está relatando o estado de controle que pode ter conseqüências para a interface do usuário em tempo real e, portanto, é um candidato a disparador de propriedade.

Algumas dessas propriedades também possuem um evento de propriedade alterada dedicado. Por exemplo, a propriedade IsMouseCaptured tem um evento de alteração de propriedade IsMouseCapturedChanged. A propriedade em si é somente leitura, com seu valor ajustado pelo sistema de entrada e o sistema de entrada gera IsMouseCapturedChanged em cada alteração em tempo real.

Em comparação com um evento de alteração de propriedade true, usando um gatilho de propriedade para atuar em uma alteração de propriedade tem algumas limitações.

Disparadores de propriedade funcionam por meio de uma correspondência exata lógica. Especifique uma propriedade e um valor que indica o valor específico para o qual o disparador atuará. Por exemplo: <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. Devido a essa limitação, a maioria dos usos de gatilho de propriedade será para propriedades booleanas, ou propriedades que recebem um valor de enumeração dedicado, onde o intervalo de valores possível é suficientemente gerenciável para definir um gatilho para cada caso. Ou disparadores de propriedade podem existir somente para valores especiais, como quando uma contagem de itens chegar a zero, e não haveria nenhum gatilho contas para os casos, quando o valor da propriedade é alterado para longe de zero novamente (em vez de disparadores para todos os casos, talvez seja necessário um manipulador de eventos de código aqui, ou um comportamento padrão que alterna do estado do disparador novamente quando o valor for diferente de zero).

A sintaxe do disparador de propriedade é análoga a uma instrução "if" em programação. Se a condição do disparador for verdadeira, em seguida, o "corpo" do disparador de propriedade é "executado". O "corpo" de um disparador de propriedade não é código, é marcação. A marcação está limitada a usar um ou mais Setter elementos para definir outras propriedades do objeto em que o estilo ou modelo está sendo aplicado.

Para deslocar a condição "se" de um disparador de propriedade que tem uma ampla variedade de valores possíveis, é aconselhável geralmente definir o mesmo valor da propriedade a um padrão usando um Setter. Dessa forma, o Trigger setter contido terá precedência quando a condição de disparador for verdadeira e o Setter que não esteja em um Trigger terá precedência quando a condição do gatilho é falsa.

Disparadores de propriedade são geralmente apropriados para situações em que uma ou mais propriedades de aparência devem alterar, com base no estado de outra propriedade no mesmo elemento.

Para saber mais sobre disparadores de propriedade, consulte Estilos e modelagem.

Mostrar: