WPF - Formatação e conversão de dados - II


Estamos continuando a primeira parte deste artigo onde apresentei os recursos necessários para realizar a formatação e 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 que para isso devemos seguir o roteiro abaixo:

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:

Public Class ConversorValor
    Implements IValueConverter

    Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, _ 
ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim formatString As String = TryCast(parameter, String)
        If formatString IsNot Nothing Then
            Return String.Format(culture, formatString, value)
        Else
            Return value.ToString()
        End If
    End Function

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, _ 
ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        'não vou usar este recurso
        Return Nothing
    End Function
End Class

A classe ConversorValor implementa a interface IValueConverter e define os métodos Convert() que no nosso exemplo esta 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 RegistroVendas

    Private _horaDaVenda As DateTime
    Private _valorDaVenda As Decimal
    Private _impostoDaVenda As [Single]
    Private _id As Integer

    Public Sub New()

    End Sub

    Public Sub New(ByVal vendasid As Integer, ByVal horaVenda As DateTime, _ 
ByVal valorVenda As Decimal, ByVal impostoPercentual As [Single])
        _id = vendasid
        _horaDaVenda = horaVenda
        _valorDaVenda = valorVenda
        _impostoDaVenda = impostoPercentual
    End Sub

    Public Property HoraDaVenda() As DateTime
        Get
            Return _horaDaVenda
        End Get
        Set(ByVal value As DateTime)
            _horaDaVenda = value
        End Set
    End Property

    Public Property Valor() As Decimal
        Get
            Return _valorDaVenda
        End Get
        Set(ByVal value As Decimal)
            _valorDaVenda = value
        End Set
    End Property

    Public Property ImpostoDaVendaPercentual() As [Single]
        Get
            Return _impostoDaVenda
        End Get
        Set(ByVal value As [Single])
            _impostoDaVenda = value
        End Set
    End Property

    Public Property ID() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property
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:

  Public Sub windowLoaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
        'defina uma instância do objeto 
        Dim vendas As ObjectDataProvider = TryCast(Me.FindResource("vendas"), ObjectDataProvider)
        'verifica se a instância é válida e atribui valores a instância da classe RegistroVendas
        If vendas IsNot Nothing Then
            Dim vendasDados As New ObservableCollection(Of RegistroVendas)()
            vendasDados.Add(New RegistroVendas(1001, System.DateTime.Now.Subtract(New TimeSpan(1, 1, 1)), 123.4D, 0.145F))
            vendasDados.Add(New RegistroVendas(1002, System.DateTime.Now.Subtract(New TimeSpan(1, 0, 0)), 42D, 0.12F))
            vendasDados.Add(New RegistroVendas(1003, System.DateTime.Now.Subtract(New TimeSpan(0, 58, 0)), 10.99D, 0.18F))
            'atribui os valores a instância criada
            vendas.ObjectInstance = vendasDados
        End If
    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"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:ConversorWPF"
    Title="Formatando com WPF" Height="185" Width="421"
    Loaded="windowLoaded">

No arquivo de recursos temos:

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

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

 <ListBox DataContext="{StaticResource vendas}" ItemsSource="{Binding}" Height="138" Width="394">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border BorderBrush="#feca00" BorderThickness="2" 
                CornerRadius="3" Padding="5" Margin="2">
                    <StackPanel Orientation="Horizontal">

            <!-- formatando o Id -->
            <TextBlock Text="{Binding Path=ID, 
              Converter={StaticResource formatter}, 
              ConverterParameter='Venda No:\{0\} '}" /> 

            <!-- formatando o valor -->
            <TextBlock Text="{Binding Path=Valor, 
              Converter={StaticResource formatter}, 
              ConverterParameter=' \{0:C\}'}" 
              FontWeight="Bold" /> 

            <!-- formatando o percentual Imposto -->
            <TextBlock Text="{Binding Path=ImpostoDaVendaPercentual, 
              Converter={StaticResource formatter}, 
              ConverterParameter=' (\{0:P\} Vendas Imposto)'}" /> 

            <!-- formatando a data -->
            <TextBlock Text="{Binding Path=HoraDaVenda, 
              Converter={StaticResource formatter}, 
              ConverterParameter=' \{0:dd-MMM-yyyy hh:mm\}'}" /> 

          </StackPanel>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

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

Eu sei é apenas WPF, mas eu gosto...

Referências:


José Carlos Macoratti