.NET

1 abr, 2011

Arquitetura WPF: O DataBinding – Parte 2

Publicidade

Olá, pessoal, estamos seguindo com o aprendizado sobre a arquitetura WPF. E nesta segunda parte do estudo sobre o Databinding, iremos aprender como utilizá-lo efetivamente, de maneira prática e fácil.

Até aqui, vimos os conceitos sobre o Databinding, como ele se diferencia do mecanismo de databinding tradicional e entendemos alguns conceitos importantes. Por exemplo, como as 4 peças fundamentais no mecanismo de binding se relacionam, a direção do fluxo dos dados e como são desencadeadas as atualizações de fonte dentro do mecanismo de binding.

Criando o Binding

Recapitulando, vimos que temos os quatro componentes que compõem o mecanismo de binding: o objeto que será a fonte dos dados (source), o objeto que será o alvo (target), a propriedade de destino (targe property) e a propriedade dentro do objeto fonte que será utilizada como caminho até o valor a ser utilizado (Path). Agora supondo que temos um objeto cliente, como uma propriedade string e que vamos utilizá-lo em um textbox. Observe abaixo o XAML de exemplo: 

Vimos os 4 componentes obrigatórios do binding em ação. A classe Pessoa é o objeto fonte de dados (source), o objeto Textbox como objeto de destino (target), a propriedade nome da classe Pessoa como propriedade que contém o valor a ser usado (Path) e por fim a propriedade Text da classe TextBox como propriedade de destino (target property). Para ilustrar melhor, veja como ficaria um diagrama do exemplo acima:

Perceba que no objeto Texbox, não especificamos o Source. Ou seja, isso chama-se binding por omissão. Por não especificar o source, o objeto Textbox herda o Source do seu objeto Pai, sendo necessário apenas especificar a propriedade Path em que o valor da mesma será utilizado e a propriedade destino no caso a propriedade Text.

Entendendo o Binding Source

Entender como especificar o BindingSource é muito importante. Sem uma fonte para os dados, não seria possível fazer absolutamente nada. No exemplo de código anterior, o DataContext é especificado somente para o objeto Grid, isso quer dizer que todos os objetos filho de Grid herdam o seu DataContext.

Existem várias maneiras de se especificar o BindingSource, ou seja, a origem dos dados a serem utilizados. O Binding por omissão é útil, quando queremos ligar vários objetos utilizando propriedades de uma mesma fonte. E você também pode especificar diretamente no objeto de destino o objeto fonte de dados (Binding Source), conforme ilustra a figura abaixo:
 

O objeto fonte de dados pode ainda ser especificado utilizando-se a propriedade da classe Binding, chamada ElementName. Conforme ilustra a figura abaixo, o objeto Textblock está ligado ao objeto Textbox através dessa propriedade, fazendo com que tudo que é digitado na caixa de texto apareça no Textblock.

 

A Propriedade Path

Se a sua fonte de dados é um objeto de negócios, você utiliza a propriedade da classe Binding, chamada Path, para indicar o valor a ser utilizado pelo Binding.O primeiro exemplo neste artigo ilustra bem isso, em que o objeto de fonte de dados é um objeto de negócios chamado pessoa, e a propriedade utilizada pelo Textbox é a propriedade nome.

Dica importante!

Quando é utilizada a ligação vazia, ItemsSource{Binding}, o objeto em questão que utiliza essa declaração herda o DataContext do objeto Pai, podendo fazer uso de qualquer propriedade do objeto fonte de dados que está ligado ao objeto pai.

ValueConverters

Observe o seguinte exemplo:

A propriedade Background da classe Button é do tipo Brush, mas está sendo atribuído um valor do tipo string a ela. Talvez você esteja se perguntando como é que funciona isso. Uma propriedade que é do tipo Brush pode ter associado a ela um valor do tipo string e não dar exceção? Não é mágica, isso se deve graças aos TypeConverters, que fazem com que haja uma conversão de um determinado tipo, para o tipo correto da propriedade. Veja o diagrama abaixo:

Os TypeConverters podem serem construídos através da implementação da interface IValueConverter. Como o exemplo de código abaixo:

[ValueConversion(typeof(Color), typeof(SolidColorBrush))]
public class ColorBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Color color = (Color)value;
return new SolidColorBrush(color);
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}

São classes como essas, que permitem a “mágica” mostrada no exemplo funcionar, em que o valor de uma propriedade do tipo string, por exemplo, consiga ser atribuída a uma propriedade cujo valor é do tipo Brush.

Espero que vocês estejam conseguindo acompanhar e atentar para os detalhes do mecanismo de Binding que são extremamente poderosos e úteis na hora de realizar a ligação dos dados em uma aplicação WPF.

Até a próxima!