Você está na página 1de 33

WPF - Usando a vinculao de dados,

conceitos e prtica
H algum tempo atrs publiquei um artigo introdutrio sobre o WPF - Windows Presentation
Foundation - e depois me calei a respeito. De l para c a ferramenta amadureceu e eu fiquei de
publicar mais sobre a vinculao de dados com WPF.
Uma aplicao WPF composta por um conjunto de pginas ou janelas XAML, e o seu respectivo
cdigo.
O WPF uma nova tecnologia com foco na apresentao grfica permitindo a criao de interfaces
visuais mais sofisticadas usando recursos de ltima gerao, uma alternativa ao Windows Forms.
(Eu disse alternativa no substituio embora creio que o Windows Forms j deu o que tinha que
dar) .
Nota: Para criar interfaces ricas de alta qualidade usando WPF voc vai precisar conhecer muito
bem XAML e tambm ser um bom design grfico. Alm disso vai precisar conhecer outras
ferramentas como o SilverLight e o Expression Blend da Microsoft para poder estender os
recursos oferecidos pelo Visual Studio. Nas apresentaes sobre WPF so mostrados exemplos de
cubos e paletas de cores mas ningum usa isso no dia a dia. Na prtica se trabalha com aplicaes
com acesso a dados o que requer tambm o conhecimento do databinding.
Recursos e objetivos do WPF:( http://msdn.microsoft.com/pt-br/library/cc564903.aspx )

O WPF veio para integrar Vdeo, Animao, Efeitos em 3D e texto, tanto Web como no
desktop;

O WPF usa o processador da placa de vdeo para criar grficos e no mais o


processador da CPU;

O XAML foi criado para facilitar que outras ferramentas criem contedo WPF. Voc
pode usar o XAML ou codificar via cdigo de programa no code-behind;

No esta baseado em pixel. (Os controles WPF no se restringem resoluo);

baseado em composio. (No WPF voc pode inserir controles dentro de controles,
compondo um novo);

A aparncia foi separada da lgica. Quando criamos um controle em WPF ele no tem
aparncia e sim eventos e propriedades de comportamento. A aparncia de um
controle pode ser determinada atravs de Templates e um template pode ser
aplicado a diversos controles.

Flexibilidade da interface, que pode ser independente do cdigo: podemos ter duas
apresentaes completamente diferentes compartilhando o mesmo comportamento;

Leva para o desktop o conceito j existente na Web de separao entre o design e o


cdigo, permitindo que a interface seja criada por um designer e o cdigo por um
programador especializado, de maneira independente;

De forma geral um programa WPF composto por duas partes bsicas :

Arquivo XML chamado XAML (eXtended Aplication Markup Language, a pronncia


zmel) - que um subtipo do XML e contm as diretrizes da interface; Podemos criar
praticamente toda a interface e do seu comportamento sem usar cdigo de programa,
apenas efetuando declaraes no XAML
Cdigo para .NET (que pode ser escrito em qualquer linguagem compatvel, VB.net, C#,
etc).

O arquivo XAML , como um bom arquivo XML apresenta as seguintes caractersticas:


- Tem um controle raiz que contm todos os outros;
- Esta ligado a uma classe no cdigo via propriedade x:Class do elemento raiz;
- Os elementos so definidos usando tags <> e </>;
- Os elementos podem conter atributos;
Ento na prtica podemos criar 3 tipos de aplicaes com WPF :

Aplicaes desktop ou standalones que rodam em janelas do Windows como os Windows


Forms;
Aplicaes web que rodam no navegador conhecidas como aplicaes XBAPs (XAML
Browser Applications);
Aplicaes que usam o SilverLIght e podem ser executadas em qualquer plataforma
(basta instalar o SilverLight);

Neste artigo eu vou mostrar como criar uma aplicao WPF usando a vinculao de dados onde irei
mostrar como acessar e efetuar as tarefas bsicas de manuteno de dados (CRUD); as operaes
para incluir, excluir, alterar, consultar e navegar nos dados. Eu no vou portanto criar um design
grfico elaborado para interface , o que seria um dos motivos para usar o WPF, vou mostrar os
conceitos para que voc possa efetuar a vinculao de dados usando WPF.

Uma pequena introduo sobre a vinculao de dados


(DataBinding)
O DataBinding no WPF fornece uma forma simples e consistente para as aplicaes de apresentar e
interagir com dados. OS elementos podem ser vinculados aos dados a partir de uma grande
variedade de fontes de dados na forma de objetos CLR e XML. A WPF fornece controles
(ContentControls) como Button e controles de itens (ItemsControls) como ListBox e ListView que
possuem funcionalidades que permitem uma flexvel customizao de estilo de uma coleo de
itens ou de um simples item, alm de permitir a ordenao, o filtro e agrupamento de vises.
O DataBinding do WPF possui muitas vantagens sobre o modelo tradicional pois inclui uma grande
variedade de propriedades com suporte a vinculao de dados, representao grfica e uma
separao lgica da lgica de negcio da interface.
A vinculao de dados o processo que estabelece uma conexo entre o aplicativo e lgica do
negcio. Se a associao possui configuraes corretas e os dados fornecem notificaes
adequadas, ento, quando os dados mudam de valor, os elementos que so associados aos dados
refletem as mudanas automaticamente.
A vinculao de dados tambm pode significar que se uma representao externa de dados em um
elemento alterada, ento os dados relacionados podem ser automaticamente atualizados para
refletir a mudana. Por exemplo, se o usurio edita o valor em um elemento TexBox, o valor do
dado relacionado na fonte de dados automaticamente atualizado para refletir a alterao.

Um uso tpico de vinculao de dados colocar o servidor ou a configurao local dos dados em
formulrios ou outros controles. No WPF esse conceito expandido para incluir a vinculao de
uma ampla variedade de propriedades para uma variedade de fontes de dados. No WPF, as
propriedades de dependncia dos elementos podem ser vinculados a objetos (incluindo objetos ou
associados com os servios da Web e propriedades da Web) e aos dados.
Independente de qual elemento voc est associando e a natureza de sua fonte de dados, cada
associao segue o modelo ilustrado na seguinte figura:

Como ilustrado pela figura acima, a vinculao de dados essencialmente a ponte entre a ligao
de destino e a sua ligao de origem. A figura demonstra os seguintes conceitos da vinculao de
dados:
Em geral, cada ligao possui quatro componentes:
1.
2.
3.
4.

Um objeto de vinculao de destino (binding target);


Uma propriedade de destino (target property);
Uma vinculao de origem (binding source);
Um caminho para o valor de vinculao de origem usar;

Por exemplo, se voc deseja vincular o contedo de um TextBox para a propriedade Name um
objeto Funcionrio, o objeto de destino o TextBox a propriedade de destino a propriedade
Text, o valor a ser usado Name (Nome) e o objeto de origem objeto Funcionrio.
A propriedade de destino deve ser uma propriedade de dependncia. A maioria das propriedades
UIElement (a classe base da WPF para construo e representao de elementos) so propriedades
de dependncia e a maioria das propriedades de dependncia , exceto aquelas somente leitura,
do suporte a vinculao de dados por padro.
Embora no especificado na figura, deve ser observado que o objeto de vinculao de origem no
restrito a ser um objeto CLR. A WPF suporta a associao de dados no formulrio de objetos CLR e
XML .
Afinal, na WPF o que destino e que fonte ?
Na WPF , voc usa o data binding para estabelecer a conexo entre as
propriedades de dois objetos. Neste relacionamento , um objeto
referenciado como sendo a fonte e o outro como sendo o destino. Em um
cenrio tpico, seu objeto fonte o objeto que contm os dados e o seu
objeto fonte o controle que pretende exibir os dados.

A direo do fluxo de dados


O fluxo de dados de uma vinculao pode ir a partir de Ligao de destino para a Ligao de
origem;Por exemplo, o valor de origem alterado quando um usurio edita o valor de um TexBox

e/ou a partir de Ligao de origem para o Ligao de destino;Por exemplo, o seu TextBox obtm e
exibe o contedo atualizado com as alteraes na ligao de origem se a origem de ligao fornece
as notificaes adequadas.
Voc pode querer que sua aplicao permita aos usurios modificar os dados e propag-los de volta
para o objeto fonte; ou voc no quer permitir que usurios atualizem a fonte de dados. Voc pode
controlar isso definindo a propriedade Mode() do seu objeto vinculado. A seguinte figura ilustra os
diferentes tipos de fluxo de dados:

O WPF oferece as seguintes possibilidades de fluxo de dados que so definidas com o


Binding.Mode:

OneWay: Ideal para situao de "somente-leitura". O que alterado na interface


destino(UI) no repassado para o a fonte de origem.

TwoWay: Tanto a origem como o destino (no caso a interface) se atualizam. Ideal para
edies. Caso a origem sofra alterao por alguma rotina interna do sistema, e no
pela interveno do usurio junto interface destino UI), a interface ser atualizada.

OneWayToSource: o inverso do OneWay. O que voc alterar a propriedade destino


a propriedade origem alterada. Ou seja uma alterao na interface se reflete na
origem de dados;

OnTime: O valor contido na origem utilizado para inicializar a interface destino(UI).


Caso a origem sofra alguma alterao em seu contedo, a interface (UI) no
atualizada; mas se a origem for alterada, por exemplo com uma nova instncia sendo
passada, o destino reflete a alterao.

O modo de vinculao TwoWay ou OneWayToSource fica monitorando as alteraes na propriedade


destino e ento as propaga para a origem. Assim voc pode editar o texto em um TextBox para
alterar o valor a origem correspondente.

Criando uma aplicao WPF com vinculao de dados


Agora vamos a prtica, criar uma aplicao WPF desktop que execute em janela Windows Forms
com vinculao de dados e recursos de alterar, incluir, excluir , e selecionar e navegar pelos dados.
Podemos usar o Visual Basic 2008 Express Edition ou o Visual Studio 2008 (ambos com service
pack1) para criar uma aplicao WPF. Vou usar o Visual Studio 2008 (Voc pode baixar a verso
trial do VS 2008 aqui ).
Abra o VS 2008 e no menu File escolha New Project e em Project Types selecione Visual Basic ->
Windows e na janela Templates marque WPF Application e informe o nome wpf_Dados e clique
em OK;

Vamos agora definir uma fonte de dados selecionando o menu Data-> Add New Data Source;
Na janela do assistente selecione DataBase e clique em Next>;
Na prxima janela selecione uma conexo com o banco de dados Northwind.mdf e clique em
Next>;
Nota: Se voc no possuir a conexo criada clique no boto New Connection... e defina a
conexo para o Northwind.mdf

Vamos aceitar e salvar a string de conexo e clicar no boto Next>;


Vamos selecionar a tabela Categories e clicar no boto Finish;

Desta forma j temos o dataset NortwindDataSet criado em nossa aplicao.


Vamos agora definir o leiaute da aplicao WPF.
Na janela Solution Explorer selecione Window1.xaml e tenha o cuidado de habilitar a partir do
menu View _> ToolBox e View -> Other Windows -> Document Outline;
De forma que voc visualize o seguinte leiaute da aplicao. Note que a janela de propriedades
um pouco diferente da usada em uma aplicao Windows Forms;

Observe que temos duas vises: a do designer e a do arquivo XAML e que por padro o formulrio
WPF apresenta a classe Window1 e o componente Grid que define o leiaute.

O que o WPF oferece?


Essencialmente temos os seguintes controles de leiautes disponibilizados: Canvas, Stackpanel,
Wrappanel, Dockpanel, Grid
Canvas - Este um dos controles de layout mais fceis de se utilizar. Igual aos formulrios
Windows Forms ou VCL, nele podemos posicionar os controle utilizando as coordenadas X,Y.
StackPanel - fcil de ser utilizado, nele os controles so empilhados verticalmente ou
horizontalmente. Isso pode ser feito pela propriedade Orientation.
Wrappanel - Distribui os controles que esto contidos nele.
Dockpanel - muito til e pode servir como leiaute base para qualquer janela WPF. Atravs dele
podemos construir os mais variados leiautes, posicionando por exemplo um menu ao topo, uma
rea livre direita e at mesmo um outro controle de layout esquerda. possvel aninhar
controles de layout. Cada controle que inserido em um dockpanel pode ser alinhado atravs da
propriedade DockPanel.Dock.
O Dockpanel tambm oferece uma propriedade muito interessante, a LastChildFill, que faz com
que o ltimo controle inserido nele preencha todo o espao restante. Utilizei essa propriedade para
fazer o Scrollbox preencher todo o espao disponvel da janela
Grid - O Grid semelhante a uma tabela, com ele definimos colunas e linhas, e dentro delas
inserimos os controles. (Veremos sua utilizao no exemplo)

Para definir o leiaute vamos criar uma linha (Row) e duas colunas(Column). Para fazer isso voc
apenas posiciona o mouse no Grid onde deseja criar a diviso e clica ajustando o tamanho;
Note que na ToolBox temos os controles WPF que poderemos arrastar e soltar no designer. Note
que temos uma quantidade de menor de controles do que nas aplicaes Windows Forms;
Vamos ento arrastar e soltar oito Button no Designer conforme o leiaute abaixo e definir a sua
propriedade Name e Content (A propriedade Content idntica a propriedade Text dos controles Windows
Forms) conforme a seguir:
1.
2.
3.
4.
5.
6.
7.
8.

Name =
Name =
Name =
Name =
Name =
Name =
Name =
Name =

btnNovo ; Content = Novo


btnExcluir ; Content = Excluir
btnCancelar ; Content = Cancelar
btnSalvar ; Content = Salvar
btnPrimeiro ; Content = |<
btnAnterior ; Content = <
btnProximo ; Content = >
btnUltimo ; Content = >|

Observe que quando voc seleciona um controle surgem setas e indicaes de tamanho e altura do
mesmo:
As setas servem para alterar o tamanho e tambm para ancorar o
controle. Para isso arraste o mouse sobre a posio da seta e quando
o cone de uma mo aparecer clique na seta para ancorar o
controle.
Note tambm que a representao esta sendo gerada no arquivo
XAML.
Vamos incluir dois controles StackPanel em cada uma das colunas criadas no Grid e expandir o
controle at o tamanho mximo das colunas;

Em seguida vamos incluir a partir da ToolBox, 3 controles Label no primeiro StackPanel, e 3


controles TextBox no segundo StackPanel e definir a sua propriedade Width como Auto de forma a
obter o seguinte resultado:

Agora vamos definir a propriedade Content do controle Label para indicar o nome de cada um dos
campos que vamos exibir ou seja: Cdigo, Nome, Descrio.
Em cada um dos controles TextBox vamos efetua as seguintes definies:

Name = txtCategoriaID : ReadOnly = True


Name = txtCategoriaNome
Name = txtCategoriaDescricao

Note que voc pode acompanhar na janela Document Outline a hierarquia de controles no WPF;

Agora temos que efetuar a vinculao de cada um dos controles TextBox com os dados. Para isso
vamos efetuar a definio no arquivo XAML usando notao especial para o binding;

Observe que definimos os nomes dos campos com os quais desejamos vincular os controles e no
caso do TextBox txtCategoryID temos a definio do Mode como OneWay pois o campo somenteleitura.
Text="{Binding Path=nomedocampo, Mode=modofluxodados }"
Agora vamos definir o cdigo para carregar os dados no code-behind. Clique com o boto direito
sobre o designer e selecione View Code;

A seguir defina o seguinte cdigo :


Nota: O evento para carga do arquivo XAML o evento Loaded.

O cdigo relativo a definio do TableAdapter e TableAdapterManager ns j conhecemos.


Os TableAdapters fornecem a comunicao entre sua aplicao e uma fonte de dados, ou seja,
um TableAdapter efetua a conexo com uma fonte de dados, executa instrues SQL ou
procedimentos armazenados e retorna um novo conjunto de dados (DataTable) preenchido com os
dados retornados ou preenche um DataTable j existente com os dados retornados. Os
TableAdapters tambm so usados para enviar dados atualizados de sua aplicao de volta a
fonte de dados.
Voc pode pensar em um TableAdapter como sendo um DataAdapter com um objeto
connection embutido e com a caracterstica de conter mltiplas consultas. Cada consulta includa
a um TableAdapter exposta como um mtodo pblico que chamado como qualquer outro
mtodo ou funo em um objeto.
Alm das funcionalidades padro de um DataAdapter , os TableAdapters fornecem mtodos
tipados adicionais que encapsulam consultas que compartilham um esquema comum com o
DataTable tipado associado; ou seja, voc pode ter tantas consultas quando voc desejar em um
TableAdapter contanto que elas retornam dados que se conformam com o mesmo esquema.

O TableAdapterManager um novo componente presente no VS 2008 que atua sobre datasets


tipados e TableAdapters e permite a atualizao de dados em tabelas relacionadas(Atualizao
hierrquica) de uma forma mais fcil. Na verso anterior era necessrio a incluso de cdigo para
realizar esta tarefa corretamente.
A atualizao hierrquica o processo de atualizao dos dados modificados em tabelas
relacionadas em um dataset tipado pela utilizao do novo componente TableAdapterManager.
O TableAdapterManager usa o relacionamento da chave primria entre as tabelas para determinar
corretamente a ordem na qual deve enviar os Inserts, Updates e Deletes do DataSet para o banco
de dados sem violar as restries da chave-primria (integridade referencial) no banco de dados.
Agora note a propriedade DataContext a qual atribumos a nossa fonte de dados.

O DataContext uma propriedade existente em qualquer FrameWorkElement e que permite que


os controles herdem, de seu parent, a fonte de dados.
Um DataContext pode ser ligado diretamente a um objeto CLR ou a um DataSource Provider. No
nosso exemplo temos uma Window e esse Window possui alguns TextBox inseridos nele. Ao se
definir que o o DataContext do Window por exemplo a classe Categories, no mais necessrio
indicar o DataContext dos demais TextBox. Eles, por estarem dentro da hierarquia do Window,
entendem que devem herdar o DataContext de Window, caso outro no seja especificado.
Existem muitas formas de especificar a sua fonte de vinculao de dados, ou seja, definir qual a origem dos seus
dados.
A forma mais simples instanciar o objeto origem como um recurso XAML e ento definir a propriedade Source
da vinculao para o recurso.

Usar a propriedade Source a forma mais simples. Porm, se mltiplas propriedades esto
vinculadas a mesma origem, considera utilizar a propriedade DataContext..
A propriedade DataContext fornece uma forma conveniente de estabelecer um escopo de dados
quando voc tem muitos controles e voc quer vincular todos a mesma origem.
Dessa forma j podemos executar a aplicao que veremos o databinding em ao exibindo os
dados da tabela Categorias no TextBox;

Agora temos que permitir a navegao pelos dados. (Lembra do BindingNavigator ? )


No WPF podemos fazer a mesma coisa usando a classe CollectionView.
A classe CollectionView representa uma viso para agrupamento, ordenao, filtragem e
navegao de uma coleo de dados.
Para criar uma viso para uma coleo que implementa IEnumeralbe, crie um objeto
CollectionViewSource, inclua a sua coleo a propriedade Source e obtenha a viso da coleo
atravs da propriedade View.
Voc pode pensar na CollectionView como uma camada na parte superior de uma vinculao de
origem que permite que voc navegue e exiba a coleo com base na classificao, filtro e
agrupamento de consultas, tudo sem precisar manipular a coleo de origem subjacentes. Se a

coleo de origem implementa a interface INotifyCollectionChanged, as alteraes que disparam o


evento CollectionChanged so propagadas para os vises.
Nas aplicaes WPF todas as colees tem uma viso de coleo padro associada. Em vez
trabalhar diretamente com a coleo, o mecanismo de ligao sempre acessa a coleo atravs de
exibio associada. Para obter o modo de exibio padro use o mtodo
CollectionViewSource.GetDefaultView.
Vamos ento implementar esta funcionalidade em nosso cdigo:

Agora s temos que implementar nos eventos dos controles Button para navegao usando os
mtodos para navegao oferecidos pela CollectionView.
Clicando duas vezes no boto de navegao podemos implementar o cdigo para navegao com a
ajuda do intellissense:

A seguir o cdigo para cada um dos botes:


Private Sub btnPrimeiro_Click(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs) Handles btnPrimeiro.Click
Me.view.MoveCurrentToFirst()
End Sub
Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs) Handles btnAnterior.Click
If view.CurrentPosition > 0 Then

Me.view.MoveCurrentToPrevious()
End If
End Sub
Private Sub btnProximo_Click(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs) Handles btnProximo.Click
If Me.view.CurrentPosition < Me.view.Count - 1 Then
Me.view.MoveCurrentToNext()
End If
End Sub
Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs) Handles btnUltimo.Click
Me.view.MoveCurrentToLast()
End Sub

Note que a lgica a mesma usada para navegao com o BindingNavigator pois temos mtodos
parecidos, vejamos os principais:

CurrentItem - Obtm o item atual na viso;


CurrentPosition - A propriedade obtm a posio ordinal do item atual(CurrentItem) da
viso;
MoveCurrentToPrevious - Define o item anterior ao CurrentItem na viso como o item
atual(CurrentItem);
MoveCurrentToNext - Define o item posterior ao CurrentItem na viso como o item
atual(CurrentItem);
MoveCurrentToLast - define o ltimo item na viso como o item atual (CurrentItem);
MoveCurrentToFirst - define o primeiro item na viso como o item atual (CurrentItem);
Count - Propriedade que retorna o nmero de registros na viso.
IsCurrentBeforeFirst - indica se o ponteiro do registro atual esta posicionado no inicio da
coleo;
IsCurrentAfterLast - indica se o ponteiro do registro atual esta posicionado no fim da
coleo;

Agora j podemos navegar usando os botes.

Na continuao deste artigo vou mostrar a implementao do cdigo para as operaes de Incluir,
alterar e excluir dados.
Acompanhe a continuao em : WPF - Usando a vinculao de dados, conceitos e prtica

II
Eu sei apenas VB .NET mas eu gosto...
Referencias:
http://msdn.microsoft.com/pt-br/library/ms752347.aspx
VB 2008 - TableAdapterManager

Executando consultas em TableAdapters

Aplicaes WPF

The Official Microsoft WPF and Windows Forms Site

Jos Carlos Macoratti

WPF - Usando a vinculao de dados,


conceitos e prtica II
Na primeira parte deste artigo eu criei uma aplicao WPF usando o VS 2008 com acesso a dados
mostrando como usar os alguns controles do WPF e efetuar o databinding. Parei na navegao pelos
registros onde usei a classe CollectionView. Neste artigo eu vou mostrar como realizar a operaes
CRUD (Create,Read,Update, Delete) na aplicao WPF. Veja abaixo o resultado final obtido com
nossa aplicao na primeira parte do artigo.

O que temos que fazer agora mostrar como efetuar as operaes para incluir , excluir , cancelar
e salvar os registros da tabela Categories no banco de dados.
Vamos comear com a incluso de um novo registro na tabela. Para isso inclua o seguinte cdigo no
evento Click do boto Novo:
Private Sub btnNovo_Click(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs) Handles btnNovo.Click
Dim linha = Me.categoriaDados.Categories.NewCategoriesRow
linha.CategoryName = "[Novo]"
Me.categoriaDados.Categories.AddCategoriesRow(linha)
Me.view.MoveCurrentToLast()
End Sub

Aqui no h segredo algum, Estamos incluindo um novo registro no dataset tipado usando a
instncia da classe CategoriesRow e atribuindo uma nova linha para em seguida preencher com os
dados que viro formulrio e no final inclumos a linha na coleo de linhas. Estamos movendo o
ponteiro para o ltimo registro que ser a linha includa.
Para excluir um registro temos o seguinte cdigo no evento Click do boto Excluir:
Private Sub btnExcluir_Click(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs) Handles btnExcluir.Click
If Me.view.CurrentPosition > -1 Then
If MessageBox.Show("Voc deseja excluir estas informaes ? ", Me.Title,
MessageBoxButton.YesNo) = MessageBoxResult.Yes Then
Dim linha = CType(Me.view.CurrentItem, System.Data.DataRowView).Row
linha.Delete()
MsgBox("Os dados foram excludos.")
End If
End If
End Sub

Neste cdigo verificamos se a linha a ser excluda uma linha vlida e exibimos uma mensagem
para confirmao do usurio.

Em seguida fazemos uma coero forada (cast) da linha atual (view.CurrentItem) para
System.Data.DataRowView e em seguida usamos o mtodo Delete para excluir a linha.
Vejamos agora o cdigo para cancelar uma operao que ser includo no evento Click do boto
Cancelar:
Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs) Handles btnCancelar.Click
If Me.categoriaDados.HasChanges Then
If MessageBox.Show("Voc deseja cancelar as alteraes feitas ? ", Me.Title,
MessageBoxButton.YesNo) = MessageBoxResult.Yes Then
Me.categoriaDados.RejectChanges()
End If
End If
End Sub

Primeiro verificamos se ocorreu uma alterao no DataSet usando o mtodo HasChanges, este
mtodo retorna um valor indicando se o DataSet sofreu alterao pela incluso , excluso ou
modificao das linhas.
Em caso positivo usamos o mtodo RejectChanges() do DataSet tipado que desfaz as mudanas
feitas no dataset desde que ele foi criado ou deste a ltima vez que o mtodo AcceptChanges foi
chamado.
Para concluir temos o cdigo para salvar os dados includo no evento Click do boto Salvar:
Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs) Handles btnSalvar.Click
Try
If Me.categoriaDados.HasChanges Then
If Me.taManager.UpdateAll(Me.categoriaDados) > 0 Then
MsgBox("Dados salvos com sucesso !")
End If
End If
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

Aqui novamente verificamos se houve alterao no dataset checando o mtodo HasChanges para
em seguida usar o mtodo UpdateAll do TableAdapterManager.
O TableAdapterManager um novo componente presente no VS 2008 que atua sobre datasets
tipados e TableAdapters e permite a atualizao de dados em tabelas relacionadas(Atualizao
hierrquica) de uma forma mais fcil. Na verso anterior era necessrio a incluso de cdigo para
realizar esta tarefa corretamente.
A atualizao hierrquica o processo de atualizao dos dados modificados em tabelas
relacionadas em um dataset tipado pela utilizao do novo componente TableAdapterManager.
O TableAdapterManager usa o relacionamento da chave primria entre as tabelas para determinar
corretamente a ordem na qual deve enviar os Inserts, Updates e Deletes do DataSet para o banco
de dados sem violar as restries da chave-primria (integridade referencial) no banco de dados.
O TableAdapterManager facilita a atualizao de mltiplas tabelas e reduz o trabalho usando o
mtodo UpdateAll.

Salvar dados de tabelas relacionados uma tarefa mais complexa pois os comandos para incluso,
atualizao e excluso para cada tabela relacionada tem que ser executadas em um ordem
especfica para evitar a violao na integridade referencial definida no banco de dados.
A classe TableAdapterManager gerada quando voc cria um dataset tipado em um projeto. Na
verdade a propriedade Hierarchical Update do dataset que determina se um
TableAdpaterManager ser criado ou no. Se o valor da propriedade for definido como True ele
ser criado e o cdigo para atualizar atualizao hierrquica em tabelas relacionadas gerado
tambm.
Para encerrar quero chamar a sua ateno para a declarao dos eventos Click nos botes de
comando da nossa aplicao. Todos eles tem seguinte sintaxe:

(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) -> WPF


Se voc comparar com o mesmo evento de um boto de uma aplicao Windows Forms ver que a
sintaxe :

(ByVal sender As System.Object, ByVal e As System.EventArgs) -> WIndows Forms


A diferena fica por conta da classe RoutedEventArgs que contm informaes do estado e dados
de evento associados com um evento roteado, e especifica do WPF.
Com isso encerramos a nossa aplicao WPF agora com todos os recursos prontos: a navegao e as
operaes CRUD.
Executando o projeto e realizando uma operao de incluir um novo registro , clicando no boto
Novo informando os dados e clicando no boto Salvar, teremos o resultado abaixo:

Pegue o projeto completo aqui :

wpf_Dados.zip

Eu sei apenas WPF mas eu gosto...


Referencias:
http://msdn.microsoft.com/pt-br/library/ms752347.aspx
VB 2008 - TableAdapterManager

Executando consultas em TableAdapters

Aplicaes WPF

The Official Microsoft WPF and Windows Forms Site

VB 2008 - TableAdapterManager

WPF - Apresentando o DataBinding

Jos Carlos Macoratti

VB 2008 - Minha primeira aplicao WPF


WPF ou Windows Presentation Foundation uma parte do .NET Framework 3.0 sendo composto
por um conjunto de classes que expe suas funcionalidades.
Nota: Leia o meu artigo: .NET - Apresentando o .NET Framework 3.0
- O .NET Framework 3.0 est
disponvel para o Windows
Vista, o Windows Server
2003 e o Windows XP;
- A verso 3.0 do .NET
Framework baseada na
verso 2.0;
- No houve nenhuma
alterao na verso 2.0
do .NET Framework e os
aplicativos feitos nesta
verso continuam a
funcionar sem necessidade
de ajustes;
- O .NET Framework 3.0
possui atualmente mais 4
novos frameworks internos :
Windows Workflow
Foundation, Windows
Communication Foundation,
Windows CardSpace e
Windows Presentation
Foundation

De forma geral um programa WPF composto por duas partes bsicas :

Arquivo XML chamado XAML (eXtended Aplication Markup Language, a pronncia


zmel) - contm as diretrizes da interface
Cdigo para .NET (que pode ser escrito em qualquer linguagem compatvel, VB.net, C#, etc).

Abrindo o Visual Basic 2008 Express Beta 2 iremos ver a seguinte tela:

Clicando em Create Project... ou no menu File New Project teremos a janela New Project
tambm mostrada acima onde notamos dois novos templates : WPF Application e WPF Browser
Application.

Clicando no boto OK vermos a interface do projeto conforme abaixo:

Como todo bom arquivo XML que se preza um arquivo XAML deve possuir:

Um n raiz ou root por arquivo;


A vinculao com uma classe no cdigo. Na figura acima temos x:Class="Windows1"
Tags (</> para definio de elementos;

Observe que na figura acima temos duas vises: A Design e a XAML , clicando sobre as setas (Swap
Panes) podemos alternar entre as mesmas; No modo de viso Design voc tem um controle que
permite controlar o tamanho da janela Window1.
Se visualizarmos a ToolBox iremos ver dois grupos de controles : Common e Controls

Como primeira aplicao vamos arrastar e soltar um controle Button e um controle ListBox na
janela Window1 conforme figura abaixo:

Vamos alterar o texto exibido no boto. Aqui encontramos a primeira mudana em relao ao
controle Button das verses anteriores. No temos mais a propriedade Text no seu lugar entrou a
propriedade Context:

Se examinarmos a janela de propriedade dos controles iremos notar mais diferenas para a verso
anterior. No caso do controle ListBox no existe mais a propriedade DataSource no seu lugar temos
a propriedade DataContext.
No evento Click do controle Button eu vou copiar e colar um cdigo que faz o acesso ao banco de
dados Northwind.mdb e exibe alguns dados da tabela Categories.
Defina os seguintes imports no formulrio Window1:
Imports System.Data.OleDb
Imports System.Data
A seguir inclua o cdigo abaixo no formulrio WIndow1:

Acima temos a figura do programa exibindo os dados aps a sua execuo.


Como nossa primeira aplicao no entrei em detalhes do DataBinding do WPF (DataTemplate,
ElementName, Windows.Resources, etc...)
At que para um incio comeamos bem. Acessamos um banco de dados e exibimos informaes de
uma tabela em uma aplicao WPF.
apenas a ponta do iceberg. Aguarde mais artigos sobre as novidades das ferramentas do Visual
Studio 2008 e verses Express...
At o prximo artigo ...
Referncias?

WPF - Apresentando o DataBindingWPF - Usando a vinculao de dados : conceitos e prtica I

Jos Carlos Macoratti

WPF - Apresentando o DataBinding


Os desenvolvedores para a plataforma Windows tem usado praticamente a mesma tecnologia de
exibio por mais de 15 anos. Uma aplicao Windows bsica se baseia em dois recursos muito
usados do sistema operacional Windows para criar a interface com o usurio:

User32 - fornece a aparncia familiar dos elementos Windows como janelas, botes, caixas
de texto, etc.;
GDI/GDI+ - fornece o suporte ao desenho para renderizar formas, texto e imagens ao custo
da tradicional complexidade e desempenho;

Ao longo dos anos essas duas tecnologias tm sido refinadas e as APIs que o desenvolvedores usam
para interagir com elas tem mudado de forma dramtica; mas se voc esta criando uma aplicao
com a plataforma .NET e WIndows Forms, ou ainda esta usando VB6, nos bastidores, os mesmos
recursos do sistema operacional Windows esto sendo usados.
A tecnologia WPF veio para mudar este cenrio ao trazer novos recursos e usar uma nova forma de
trabalho que trabalha diretamente como a tecnologia DirectX.
O Microsoft Windows Presentation Foundation - WPF introduz uma nova maneira de criar
interfaces com o usurio em clientes ricos oferecendo recursos grficos e uma nova linguagem de
marcao chamada XAML que baseada em XML com um novo modelo de desenvolvimento que
inclui um rico modelo para a ligao de dados.
O WPF efetua a separao do design da interface do usurio e do cdigo de uma maneira parecida
com ASP .NET onde temos em um arquivo a linguagem de marcao e em outro o cdigo, o arquivo
code-behind.
Um dos recursos mais poderosos apresentado pelo WPF o databinding que permite efetuar a
ligao com dados de diversas fontes de dados sem ter que utilizar cdigo, permitindo gerenciar a
execuo e edio de dados complexos.
isso mesmo, se voc odeia codificar, vai amar o WPF, pois voc pode atravs da linguagem
declarativa de marcao (XAML) criar toda a interface com o usurio e efetuar a ligao de dados
sem usar cdigo.(Naturalmente tudo que voc pode fazer no XAML voc pode fazer via cdigo).
Alm disso o WPF apresenta as seguintes novas caractersticas na verso 3.5 (service pack1 do VS):

Suporte a aplicaes WEB com FireFox - Voc agora pode rodar aplicaes WPF do tipo web
tanto no FireFox como no IE;
Suporte ao LINQ no databinding - O WPF agora da suporte a utilizao do LINQ na vinculao
de dados;(Sim, o suporte ao LINQ nativo)
Suporte a interface IDataErrorInfo no databinding - Agora a infraestrutura do databinding
pode capturar erros de validaes e exib-los usando esta interface;
Suporte a utilizao interativa de controles em um controle RichtTextBox;
Suporte para a utilizao de elementos 2-D em superfcies 3-D;
Um modelo de Add-In que permite usar componentes de terceiros em um contexto de
segurana;

O que o DataBinding
Para comear a usar o databinding com WPF voc deve sempre definir um destino e uma origem.
O destino da ligao pode ser qualquer propriedade acessvel ou elemento derivado da classe
DependencyProperty. Um exemplo a propriedade Text do controle TextBox.

A classe representa uma propriedade de dependncia que registrada com WPF. Propriedades de dependncia fornecem
para expresses de valor, validao de propriedades e a coero de valores dependentes, valores padro, herana, a liga
dados, animao, notificao e estilo.

A origem da ligao pode ser qualquer propriedade pblica, incluindo propriedades de outros
controles , objetos CLR, elementos XAML, datasets, arquivos XML, etc. A WPF oferece dois
provedores especiais para ajudar na ligao de dados: XmlDataProvider e ObjectDataProvider.
O objeto XmlDataProvider permite Acessar aos dados XML declarativs para associao de dados.
XmlDataProvider expe das seguintes maneiras para acessar dados XML:

Voc pode incorporar dados usando a classe XmlDataProvider;


Voc pode definir a propriedade Source para a URI uma arquivo de dados XML;

Voc pode definir a propriedade Document para um XmlDocument;


A classe ObjectDataProvider envolve e cria um objeto que voc pode usar como fonte de ligao de dados.
H vrias maneiras para criar um objeto para usar como uma fonte de ligao .Por exemplo, voc pode criar o
objeto na seo Recursos da pgina Linguagem de marcao de aplicativos extensvel (XAML),ou voc pode
criar o objeto no cdigo e defini-lo como DataContext.

O fluxo de dados na vinculao de dados ocorrer de duas formas bsicas :

1. Unidirecional (OneWay) - A alterao feita somente na origem; Somente a propriedade do


objeto alterada; a fonte de dados no alterada;
2. Bidirecinal (TwoWay) - A alterao feita na origem e no destino, ou seja, a alterao da
propriedade altera a fonte de dados;
3. OneWayToSource: o inverso do OneWay. O que voc alterar a propriedade destino
a propriedade origem alterada. Ou seja uma alterao na interface se reflete na
origem de dados;
Para ficar mais claro vamos a um exemplo bem simples:
Voc deseja exibir um valor de um campo de um banco de dados na propriedade Text de um
controle TextBox.

No modo unidirecional o valor do campo exibido na TextBox e no permite alterao (isso pode
ser usado para campos do tipo somente-leitura)
No modo bidirecional o valor do campo exibido e quando voc altera o valor da TextBox a
alterao propagada para o banco de dados.
- DataBinding entre controles
Vejamos na prtica como usar sintaxe da linguagem XAML para ligar a propriedade Text de um
controle TextBox e a propriedade Value de um controle Slider:

<ProgressBar Text="{Binding ElementName=Slider, Path=Value}" Width="50"


Height="20"/>
onde :
ElementName - indica o nome do controle que ser a fonte de dados;
Path - indica a propriedade que ser usada para preencher a propriedade Text da TextBox;
Em contrapartida o controle Slider precisaria ser definido assim:
<Slider Name="Slider" Width="150" Height="30" Maximum="100" />
- DataBinding entre um controle e uma fonte de dados
Agora vejamos como ficaria a declarao para a ligao entre a propriedade Text de um controle
TextBox e o campo CategoryName da tabela Categories do banco de dados Northwind.mdb:

<TextBox Width="50" Height="20" Text="{Binding Path=CategoryName}" />


para definir se a ligao de dados unidirecional ou bidirecional usamos a propriedade Mode:

<TextBox Width="50" Height="20" Text="{Binding Path=CategoryName,


Mode=OneWay/TwoWay}" />
Alm disso podemos usar o recurso de criar modelos e de usar a classe DataTemplate para a
realizar a vinculao de dados.
No WPF os controles possuem um modelo padro definido pelo sistema operacional. Voc pode
personalizar o visual de um controle atravs da criao de templates(modelos). Veja o exemplo
abaixo:

<Button x:Name="Botao1">
<Button.Template>
<ControlTemplate>
<Ellipse Fill="Red"/>
</ControlTemplate>
</Button.Template>
</Button>

Neste cdigo estamos definindo que o boto fique com o formato de uma elipse atravs da criao
de um template.
Usando a classe DataTemplate
O modelo data templating da WPF fornece a voc uma grande flexibilidade para definir a
apresentao de dados. Os controles WPF possui funcionalidades embutidas para suporta a
personalizao da apresentao dos dados.
Toda a funcionalidade de modelagem do WPF esta baseada na classe FrameworkTemplate.
A classe DataTemplate deriva de FrameworkTemplate como todas as outras classes usadas para o
propsito da modelagem.
muito mais fcil e rpido criar uma DataTemplate via declarao XAML do que usar cdigo de
programa. O cdigo para criao de modelos atualmente um tanto complexo e confuso, enquanto
que a linguagem declarativa XAML simples e limpa.
O DataTemplate pode gerar tantos elementos visuais quantos forem necessrios para exibir o
objeto de dados. Esses elementos usam ligaes de dados para exibir os valores da propriedade do
objeto de dados. Se um elemento no sabe como exibir o objeto que ele deve processar, ele
simplesmente chama o mtodo ToString nele e exibe o resultado em um TextBlock.
Uma outra caracterstica da WPF que usada em conjunto com os modelos conhecido como
'triggers' (gatilhos). Um gatilho algo como um bloco if usado no cdigo procedural e somente
executa o que o bloco contm quando uma condio avaliada for verdadeira.
Os triggers so disparados por condies como por exemplo os valores das propriedades, e
permitem alterar os estilos dos objetos e efetuar diversas aes. H diversos tipos de triggers mas
os dois tipos bsicos so :

Triggers de propriedade - Tm como condio o valor de uma propriedade do objeto:


MultiTriggers - So gatilhos(triggers) que tm como condio valores de vrias propriedades

Exemplo de ligao de dados


Vou encerrar este artigo com um exemplo prtico de ligao de dados mais simples que existe : A
ligao as propriedades de um elemento.
Neste exemplo temos um objeto origem que um elemento WPF e sua propriedade Source que
uma propriedade de dependncia.
Abra o Visual Studio 2008 e crie um novo projeto, menu File-> New Project, do tipo WPF
Application com o nome wpf_DatBinding;
Na janela padro Window1.xaml inclua a partir da ToolBox um controle Slider e um controle
TextBlock no interior do leiaute Grid:

Define as propriedades dos controles conforme mostrado no arquivo XAML, segue abaixo o cdigo
usado:
Controle Slider:

<Slider Height="22" Margin="30,22,24,0"


Name="Slider1"
VerticalAlignment="Top"
Minimum="1"
Maximum="30"
Value="10"
TickFrequency="1"
TickPlacement="TopLeft"
/>

Controle TextBlock:

<TextBlock Margin="30,59,16,45"
Name="TextBlock1"
Text="Macoratti.net"
FontSize="{Binding
ElementName=Slider1,
Path=Value}"
/>
Ao executar o projeto e mover o ponteiro do controle Slider o tamanho do texto ir ser alterado
conforme voc move para direita ou para esquerda, conforme a figura abaixo:

Veja que voc no usou cdigo apenas a poderosa linguagem declarativa de marcao XAML. A
declarao responsvel pelo comportamento :

FontSize="{Binding

ElementName=Slider1, Path=Value}"

Nesta declarao estamos vinculando a propriedade Value do Controle Slider1 a propriedade


FontSize da propriedade Text do controle TextBlock.
No controle Slider configuramos apenas o valores mximo e mnimo.
Veja um exemplo de aplicao WPF com mais recursos em
http://www.vertigo.com/familyshow.aspx (FamilyShow)
Faa o download dos fontes do FamlyShow em :
http://www.codeplex.com/familyshow/Release/ProjectReleases.aspx?ReleaseId=23637
O familyShow uma aplicao WPF gratuta disponibilizada sob a licena
Ms-PL que permite baixar o cdigo-fonte e abr-lo. Ento voc pode baixar
os fontes do FamilyShow e abrir no seu Visual Studio para estudar o cdigo.
Voc ter uma aplicao com uma excelente qualidade grfica e com acesso
a dados.

Com esta pequena introduo espero ter lanado alguma luz sobre o funcionamento do databinding
do WPF. A seguir irei mostrar exemplos mais funcionais com vinculao a fonte de dados.
Eu sei apenas WPF , mas eu gosto...

Referencias:
http://msdn.microsoft.com/en-us/library/system.windows.forms.autocompletemode.aspx
http://msdn.microsoft.com/enus/library/system.windows.forms.textbox.autocompletemode.aspx
http://blogs.zdnet.com/Stewart/?p=320
http://msdn.microsoft.com/pt-br/library/cc564903.aspx

Jos Carlos Macoratti