Dependency Property/Object no WPF


Depois de apanhar um pouco e achar pouco material disponível na internet de como implementar uma Dependency Property, ou mais ainda como fazer um Binding em um controle personalizado que você fez, resolvi escrever esse post.

Bom, imaginando que todos que coloquem as mãos no WPF já tenham trabalhando em outra arquitetura .Net, a pessoa vai estranhar um pouco definir as propriedades do controle pelo code-behind, pois as propriedades são todas do tipo DependecyProperty, aí você deve definir um Dependency Object a ele. E o intelissense já não ajudará mais a você encontrar qual o tipo de valor que você deve atribuir a determinada propriedade.

Na verdade, esse comportamento do DependencyObject/ DependencyProperty existe por várias razões, as quais eu gostaria de falar aqui, mas vamos começar com um dos principais conceitos existentes conhecido como attached properties (ou propriedades anexadas em português). Você encontrará o conceito de attached properties quase que imediatamente que você começar a trabalhar com o WPF. As propriedades anexadas são dependency properties que outras classes declaram que pode ser aplicado a qualquer classe que você jogar na mistura do WPF.

Veja um dos mais simples exemplos de attached properties que envolve o posicionamento de um item dentro de um container, pois existem vários tipos de containers (um controle que pode conter outros controles), como Grid ou Canvas. Vejamos o controle Canvas que tem 4 dependency properties para posicionamento de elementos: TopProperty, BottomProperty, LeftProperty e RightProperty. Agora, suponha que queiramos jogar qualquer elemento UI em um Canvas. Essa classe do elemento UI não tem nenhum conhecimento anterior da existencia de uma classe Canvas ou como ela escolhe para posicionar os elementos que contém. Então, quando eu quero colocar um elemento UI “dentro" de um Canvas, eu preciso adorna-lo com dependency properties específicas do Canvas para exibi-lo corretamente.

Agora você deve estar pensando "Bom, então por que não ter apenas uma classe base para todos elementos de UI com as propriedades Top, Bottom, Left e Right?". Bem, a resposta para isso é simples se você considerar um container com posicionamento diferente como o Grid. O Grid não posiciona os elementos em uma coordenada X,Y estática como o Canvas. Ele usa linhas e colunas e automagicamente posiciona os elementos contidos nas linhas (para X) e colunas (para Y). Então, para conseguir isso, o Grid oferece as seguintes dependency properties para posicionamento: ColumnProperty e RowProperty.

Então a próxima questão é: Como essas propriedades se aplicam as classes arbitrárias? Bem, primeiro de tudo, as classes obviamente precisam herdar do DependencyObject.

From the consumer point of view, DependencyObject is little more than a glorified Hashtable2. It's job is to store the current values of any DependencyProperty that is ever applied to it. Setting a dependency property is simple.

Referências: http://geekswithblogs.net/thibbard/archive/2008/04/22/wpf-custom-control-dependency-property-gotcha.aspx http://social.msdn.microsoft.com/forums/en-US/wpf/thread/2cb12481-ef86-40b7-8333-443598d89933/ http://blog.hackedbrain.com/articles/UnderstandingDependencyObjectAndDependencyProperty.aspx

Comentários

Postagens mais visitadas