WPF - DataBinding com Entity Data Model
Neste artigo eu continuo abordando o WPF mostrando como realizar algumas tarefas básicas integradas com outras funcionalidades da plataforma .NET.
Hoje eu mostro como realizar o databinding em controles WPF com vinculação de dados usando o Entity Data Model do Entity Framework.
Se o Entity Framework é uma novidade para você veja os artigos da respectiva seção para saber mais.
Usando o Entity Data Model com o WPF
Vamos usar os recursos do Entity Data Model para criar o acesso aos dados na nossa aplicação.
Eu estou usando o Visual Studio 2010 Beta 2, que você pode pegar neste link: http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx
Primeiro vamos criar o projeto no VS 2010 , no menu File -> New Project , selecione WPF Application, informe o nome wpf_EDM e clique em OK;
Selecione em seguida o arquivo MainWindow.xaml e inclua as linhas de código abaixo entre as tags <Grid> no código XAML:
<Grid.RowDefinitions> <RowDefinition Height="75" /> <RowDefinition Height="425" /> </Grid.RowDefinitions> <Button HorizontalAlignment="Left" Margin="22,20,0,24" Name="backButton" Width="75"><</Button> <Button HorizontalAlignment="Left" Margin="116,20,0,24" Name="nextButton" Width="75">></Button> <Button HorizontalAlignment="Right" Margin="0,21,46,24" Name="saveButton" Width="110">Salvar Alterações</Button> |
O resultado que você deve obter é mostrado na figura abaixo:
Vamos criar um Entity Data Model onde irei acessar o banco de dados Cadastro.mdf criado no SQL Server 2005 Express;
No menu Project selecione Add New Item e a seguir selecione o template Data e o item ADO .NET Entity Data Model informando o nome Cadastro.edmx e clicando no botão Add;
Na janela do Assistente selecione a opção Generate From Database e clique Next>;
Selecione a conexão com o banco de dados Cadastro.mdf, aceite o nome CadastroEntities e clique em Next;
A próxima janela do assistente pergunta se você deseja copiar o banco de dados para o seu projeto e modificar a conexão , clique no botão No (Não);
Agora exiba as tabelas e selecione as tabelas Clientes e Estados , aceite o nome CadastroModel e clique em Finish;
A final será criado o item Clientes.edmx exibindo no descritor EF as entidades mapeadas a partir das tabelas do banco de dados conforme abaixo;
Vamos agora usar o mapeamento gerado pelo Entity Data Model para criar um Data Source a partir do qual iremos fazer a vinculação dos dados com os controles WPF;
No menu Data selecione Show
Data Sources. Você verá na janela Data Sources
os objetos Clientes e Estados(que não irei usar). Expanda o objeto Clientes e no campo foto selecione None pois não iremos exibir este campo no formulário WPF. Clique no objeto Clientes e selecione Details pois queremos exibir os campos em controles TextBox e não em um Grid; Feito isso estamos prontos para realizar o grande truque: Arrastar e Soltar... Isso mesmo clique no item Clientes e arraste para o formulário WPF logo abaixo dos controles Buttons que criamos no formulário; |
Na figura abaixo você verá o resultado final (eu já ajustei o tamanho dos controles) onde temos
Agora vamos efetuar alguns ajustes no código que foi gerado pelo Assistente para permitir as funcionalidades de navegação pelos registros e de salvar as alterações feitas nos controles do formulário WPF;
Selecione e abra o arquivo MainWindow.xaml.vb para visualizar e ter acesso a código que foi gerado pelo assistente.
Defina os seguintes imports no código para declarar os namespaces usados e assim tornar o código mais legível:
Imports System.Data
Imports System.Data.Objects
Com isso você já pode eliminar o System.Data e System.Data.Objects gerados pelo assistente deixando somente o
nome do método/classe;
No início do formulário defina o código declarando os objetos que deverão ser visíveis em todo o projeto:
Dim
ClientesViewSource As CollectionViewSource
Dim CadastroEntities As wpf_EDM.CadastroEntities
Reescreva o código do evento Window_Loaded
conforme descrito a seguir:
Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded ClientesViewSource = CType(Me.FindResource("ClientesViewSource"), CollectionViewSource) CadastroEntities = New wpf_EDM.CadastroEntities Dim ClientesQuery As ObjectQuery(Of wpf_EDM.Clientes) = Me.GetClientesQuery(CadastroEntities) ClientesViewSource.Source = ClientesQuery.Execute(MergeOption.AppendOnly) End Sub |
Precisamos definir a consulta ClientesQuery e para isso vamos criar um método chamado GetClientesQuery que obtém e retorna os dados da entidade Clientes;
Private Function GetClientesQuery(ByVal CadastroEntities As wpf_EDM.CadastroEntities) As System.Data.Objects.ObjectQuery(Of wpf_EDM.Clientes) Dim ClientesQuery As ObjectQuery(Of wpf_EDM.Clientes) = CadastroEntities.Clientes Return ClientesQuery End Function |
A seguir no evento Click do botão btnRetornar defina o código abaixo:
Private Sub btnRetornar_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnRetornar.Click If ClientesViewSource.View.CurrentPosition > 0 Then ClientesViewSource.View.MoveCurrentToPrevious() End If End Sub |
No evento Click do botão btnAvancar digite o código a seguir:
Private Sub btnAvancar_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAvancar.Click If ClientesViewSource.View.CurrentPosition < CType(ClientesViewSource.View, CollectionView).Count - 1 Then ClientesViewSource.View.MoveCurrentToNext() End If End Sub |
Agora executando o projeto iremos obter:
E dessa forma demonstrei as facilidades do databinding no WPF usando o Entity Data Model e usando um Data Source onde efetuamos a navegação pelos registros e persistimos as alterações feitas nos controles na base de dados.
Pegue o projeto completo aqui: wpf_EDM.zip (Lembre-se que você precisa do VS2010 beta 2 para abrir o projeto)
Eu sei é apenas WPF , mas eu gosto...
Referências: