Dev (Back & Front)ARTIGO

WPF – Conversão e formatação de dados – Parte 02

Na primeira parte
deste artigo
apresentei os recursos necessários para
realizar a formatação e a conversão de valores no WPF. Vamos
agora a um exemplo prático.

Neste exemplo eu vou criar uma
aplicação WPF onde, usando a vinculação de dados, irei exibir
as informações formatadas em um controle WPF.

Para tornar o exemplo mais simples,
eu não vou usar um banco de dados; ao invés disso vou usar uma
classe, atribuir valores a ela e usá-la como um recurso em
minha aplicação WPF onde estarei implementando a formatação
usando a interface IValueConverter.

Lembre-se de que para isso devemos
seguir o roteiro abaixo:

  1. Criar uma classe que implementa
    a interface IValueConverter;
  2. Incluir o atributo ValueConversion
    na declaração da classe e especificar os tipos de dados
    de destino e de origem;
  3. Implementar o método Convert()

    que altera os dados a partir do formato original para o
    formato de exibição;

  4. Implementar o método ConvertBack()

    que reverte as alterações e altera o valor a partir do
    formato de exibição para o formato original;

Eu vou usar o Visual Basic 2008 Express
Edition para criar o projeto
WPF, então abra o seu VB 2008 Express e
selecione no menu File
-> New Project (Arquivo->Novo Projeto)

Agora vamos criar uma classe no
projeto para implementar o conversor usando a interface IValueConverter.
No menu
Project-> Add Class (Projeto->Adiconar Classe)
defina a classe ConversorWPF.vb com
o
seguinte código:

<strong>Public Class ConversorValor<br />    Implements <br />IValueConverter<br /></strong><br /><strong>    Public Function Convert</strong>(ByVal<br /> value As Object, ByVal targetType As System.Type, ByVal parameter As <br />Object, _ <br />ByVal culture As System.Globalization.CultureInfo) As <br />Object Implements System.Windows.Data.IValueConverter.Convert<br /><br /> Dim formatString As String = TryCast(parameter, String)<br />        If <br />formatString IsNot Nothing Then<br /><strong> Return <br />String.Format(culture, formatString, value)</strong><br />        Else<br /><br />            Return value.ToString()<br />        End If<br />    End <br />Function<br /><br /><strong>    Public Function ConvertBack</strong>(ByVal <br />value As Object, ByVal targetType As System.Type, ByVal parameter As <br />Object, _ <br />ByVal culture As System.Globalization.CultureInfo) As <br />Object Implements System.Windows.Data.IValueConverter.ConvertBack<br /><em><br />        'não vou usar este recurso</em><br />        Return Nothing<br /><br /> End Function<br />End Class

A classe ConversorValor
implementa a interface IValueConverter e define
os métodos Convert(), que no nosso exemplo está
efetuando a formatação de uma string conforme o parâmetro
informado, tomando como base a cultura local e o método ConvertBack(),
que não estamos usando neste exemplo.

Agora, vamos incluir uma outra classe,
chamada RegistroVendas.vb, onde estamos definindo
algumas propriedades que serão usadas como fonte de dados para
nossa aplicação. Segue abaixo o código da classe:

Public Class <strong>RegistroVendas</strong><br /><br />    Private <br />_horaDaVenda As DateTime<br />    Private _valorDaVenda As Decimal<br /><br />Private _impostoDaVenda As [Single]<br />    Private _id As Integer<br /><br /><br />    Public Sub New()<br /><br />    End Sub<br /><br />    Public Sub New(ByVal <br />vendasid As Integer, ByVal horaVenda As DateTime, _ <br />ByVal valorVenda<br /> As Decimal, ByVal impostoPercentual As [Single])<br />        _id = <br />vendasid<br />        _horaDaVenda = horaVenda<br />        _valorDaVenda = <br />valorVenda<br />        _impostoDaVenda = impostoPercentual<br />    End Sub<br /><br /><br />    Public Property HoraDaVenda() As DateTime<br />        Get<br /><br />    Return _horaDaVenda<br />        End Get<br />        Set(ByVal value As<br /> DateTime)<br />            _horaDaVenda = value<br />        End Set<br /><br /> End Property<br /><br />    Public Property Valor() As Decimal<br /><br />Get<br />            Return _valorDaVenda<br />        End Get<br /><br />Set(ByVal value As Decimal)<br />            _valorDaVenda = value<br /><br />    End Set<br />    End Property<br /><br />    Public Property <br />ImpostoDaVendaPercentual() As [Single]<br />        Get<br /><br />Return _impostoDaVenda<br />        End Get<br />        Set(ByVal value As <br />[Single])<br />            _impostoDaVenda = value<br />        End Set<br /><br />   End Property<br /><br />    Public Property ID() As Integer<br /><br />Get<br />            Return _id<br />        End Get<br />        Set(ByVal <br />value As Integer)<br />            _id = value<br />        End Set<br /><br />End Property<br />End Class

Na nossa aplicação WPF criada
temos o arquivo Window1.xaml e seu code-behind Window1.xaml.vb. Vamos definir o código para atribuir valores no arquivo
code-behind de forma a termos as informações para formatar e
exibir na aplicação WPF. Abaixo temos o código que faz isso:

<strong>  Public Sub windowLoaded</strong>(ByVal sender As Object, <br />ByVal e As RoutedEventArgs)<br />        'defina uma instância do objeto <br /><br />        Dim vendas As ObjectDataProvider = <br />TryCast(Me.FindResource("vendas"), ObjectDataProvider)<br /><br />'verifica se a instância é válida e atribui valores a instância da <br />classe RegistroVendas<br />        If vendas IsNot Nothing Then<br /><br />     Dim vendasDados As New ObservableCollection(Of RegistroVendas)()<br /><br />            vendasDados.Add(New RegistroVendas(1001, <br />System.DateTime.Now.Subtract(New TimeSpan(1, 1, 1)), 123.4D, 0.145F))<br /><br />            vendasDados.Add(New RegistroVendas(1002, <br />System.DateTime.Now.Subtract(New TimeSpan(1, 0, 0)), 42D, 0.12F))<br /><br />         vendasDados.Add(New RegistroVendas(1003, <br />System.DateTime.Now.Subtract(New TimeSpan(0, 58, 0)), 10.99D, 0.18F))<br /><br />            'atribui os valores a instância criada<br /><br />vendas.ObjectInstance = vendasDados<br />        End If<br />    End Sub

No WPF os controles possuem tanto o
evento Loaded como o evento Initialized.
Esses eventos praticamente ocorrem ao mesmo tempo, mas possuem
algumas diferenças. No nosso exemplo estamos usando o evento windowLoaded.

O evento Loaded é
disparado quando um elemento é não apenas inicializado, mas
também renderizado. A motivação para para usar este evento é
um cenário onde desejamos realizar a inicialização na carga da
aplicação.

Agora já podemos definir o código
na aplicação WPF para acessar e exibir as informações
formatadas usando as classes que definimos acima.

A visão que devemos ter do arquivo
Window1.xaml no descritor exibindo as duas visualizações é a
seguinte:

Vejamos como deve ficar o código
definindo no arquivo Window1.xaml:

<Window x:Class="Window1"<br /><br />xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"<br /><br /><br /> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"<br /><br />xmlns:local="clr-namespace:ConversorWPF"<br /><br />    Title="Formatando com <br />WPF" Height="185" Width="421"<br /><br />Loaded="windowLoaded">

No arquivo de recursos temos:

<Window.Resources><br />  <ObjectDataProvider <br />x:Key="vendas" /><br />        <local:ConversorValor <br />x:Key="formatter" /><br />    </Window.Resources>

Aqui estamos efetuando as formatações
usando o
conversor de valor:

<ListBox DataContext="{StaticResource vendas}" <br />ItemsSource="{Binding}" Height="138" Width="394"><br /><br /><ListBox.ItemTemplate><br />            <DataTemplate><br /><br />            <Border BorderBrush="#feca00" BorderThickness="2" <br /><br />             CornerRadius="3" Padding="5" Margin="2"><br /><br />        <StackPanel Orientation="Horizontal"><br /><br /><br /><!-- formatando o Id --><br />            <TextBlock <br />Text="{Binding Path=ID, <br />              Converter={StaticResource <br />formatter}, <br />              ConverterParameter='Venda No:\{0\} '}" <br />/> <br /><br />            <!-- formatando o valor --><br /><br />   <TextBlock Text="{Binding Path=Valor, <br /><br />Converter={StaticResource formatter}, <br /><br />ConverterParameter=' \{0:C\}'}" <br />              FontWeight="Bold" <br />/> <br /><br />            <!-- formatando o percentual Imposto --><br /><br />            <TextBlock Text="{Binding Path=ImpostoDaVendaPercentual, <br /><br />              Converter={StaticResource formatter}, <br /><br />ConverterParameter=' (\{0:P\} Vendas Imposto)'}" /> <br /><br /><br />   <!-- formatando a data --><br />            <TextBlock <br />Text="{Binding Path=HoraDaVenda, <br /><br />Converter={StaticResource formatter}, <br /><br />ConverterParameter=' \{0:dd-MMM-yyyy hh:mm\}'}" /> <br /><br /><br /></StackPanel><br />                </Border><br /><br /></DataTemplate><br />        </ListBox.ItemTemplate><br /><br /></ListBox>

Executando o projeto, iremos obter a
visualização
dos valores formatados, conforme abaixo:

Eu sei, é apenas WPF, mas eu
gosto…

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil