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">&lt;</Button>
<Button HorizontalAlignment="Left" Margin="116,20,0,24" Name="nextButton" Width="75">&gt;</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:


José Carlos Macoratti