Passo a passo: Vinculação a dados em aplicativos híbridos
Vincular uma fonte de dados a um controle é essencial para fornecer aos usuários acesso aos dados subjacentes, quer você esteja usando Windows Forms ou WPF. Este passo a passo mostra como você pode usar a vinculação de dados em aplicativos híbridos que incluem controles Windows Forms e WPF.
As tarefas ilustradas neste passo a passo incluem:
Criação do projeto.
Definição do modelo de dados.
Especificando o layout do formulário.
Especificação de associações de dados.
Exibição de dados usando interoperação.
Adicionando a fonte de dados ao projeto.
Vinculação à fonte de dados.
Para obter uma lista de código completa das tarefas ilustradas nesta explicação passo a passo, consulte Exemplo de vinculação de dados em aplicativos híbridos.
Quando terminar, você terá uma compreensão dos recursos de vinculação de dados em aplicativos híbridos.
Pré-requisitos
Você precisa dos seguintes componentes para concluir este passo a passo:
Visual Studio.
Acesso ao banco de dados de exemplo Northwind em execução no Microsoft SQL Server.
Criando o projeto
Para criar e configurar o projeto
Crie um projeto de aplicativo WPF chamado
WPFWithWFAndDatabinding
.No Explorador de Soluções, adicione referências aos seguintes assemblies.
Integração do WindowsForms
System.Windows.Forms
Abra MainWindow.xaml no WPF Designer.
No elemento Window, adicione o seguinte mapeamento de namespaces do Windows Forms.
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Nomeie o elemento Grid padrão
mainGrid
atribuindo a propriedade Name.<Grid x:Name="mainGrid">
Definindo o modelo de dados
A lista mestra de clientes é apresentada num controlo ListBox. O exemplo de código a seguir define um objeto DataTemplate chamado ListItemsTemplate
que controla a árvore visual do controle ListBox. Esse DataTemplate é atribuído à propriedade ItemTemplate do controle ListBox.
Para definir o modelo de dados
Copie o seguinte XAML para a declaração do elemento Grid.
<Grid.Resources> <DataTemplate x:Key="ListItemsTemplate"> <TextBlock Text="{Binding Path=ContactName}"/> </DataTemplate> </Grid.Resources>
Especificando o layout do formulário
O layout do formulário é definido por uma grade com três linhas e três colunas. Label Os Controles são fornecidos para identificar cada coluna na tabela Clientes.
Para configurar o layout de grelha
Copie o seguinte XAML para a declaração do elemento Grid.
<Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions>
Para configurar os controlos do Label
Copie o seguinte XAML para a declaração do elemento Grid.
<StackPanel Orientation="Vertical" Grid.Row="0" Grid.Column="1"> <Label Margin="20,38,5,2">First Name:</Label> <Label Margin="20,0,5,2">Company Name:</Label> <Label Margin="20,0,5,2">Phone:</Label> <Label Margin="20,0,5,2">Address:</Label> <Label Margin="20,0,5,2">City:</Label> <Label Margin="20,0,5,2">Region:</Label> <Label Margin="20,0,5,2">Postal Code:</Label> </StackPanel>
Especificando associações de dados
A lista principal de clientes é exibida num controlo de ListBox. O ListItemsTemplate
anexado vincula um controle TextBlock ao campo ContactName
do banco de dados.
Os detalhes de cada registro de cliente são exibidos em vários controles TextBox.
Para especificar associações de dados
Copie o seguinte XAML para a declaração do elemento Grid.
A classe Binding vincula os controles TextBox aos campos apropriados no banco de dados.
<StackPanel Orientation="Vertical" Grid.Row="0" Grid.Column="0"> <Label Margin="20,5,5,0">List of Customers:</Label> <ListBox x:Name="listBox1" Height="200" Width="200" HorizontalAlignment="Left" ItemTemplate="{StaticResource ListItemsTemplate}" IsSynchronizedWithCurrentItem="True" Margin="20,5,5,5"/> </StackPanel> <StackPanel Orientation="Vertical" Grid.Row="0" Grid.Column="2"> <TextBox Margin="5,38,5,2" Width="200" Text="{Binding Path=ContactName}"/> <TextBox Margin="5,0,5,2" Width="200" Text="{Binding Path=CompanyName}"/> <TextBox Margin="5,0,5,2" Width="200" Text="{Binding Path=Phone}"/> <TextBox Margin="5,0,5,2" Width="200" Text="{Binding Path=Address}"/> <TextBox Margin="5,0,5,2" Width="200" Text="{Binding Path=City}"/> <TextBox Margin="5,0,5,2" Width="30" HorizontalAlignment="Left" Text="{Binding Path=Region}"/> <TextBox Margin="5,0,5,2" Width="50" HorizontalAlignment="Left" Text="{Binding Path=PostalCode}"/> </StackPanel>
Apresentação de Dados usando Interoperabilidade
Os pedidos correspondentes ao cliente selecionado são exibidos em um controle de System.Windows.Forms.DataGridView chamado dataGridView1
. O controle dataGridView1
está vinculado à fonte de dados no arquivo code-behind. Um controle WindowsFormsHost é o pai desse controle Windows Forms.
Para exibir dados no controle DataGridView
Copie o seguinte XAML para a declaração do elemento Grid.
<WindowsFormsHost Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Margin="20,5,5,5" Height="300"> <wf:DataGridView x:Name="dataGridView1"/> </WindowsFormsHost>
Adicionando a fonte de dados ao projeto
Com o Visual Studio, você pode facilmente adicionar uma fonte de dados ao seu projeto. Este procedimento adiciona um conjunto de dados fortemente tipado ao seu projeto. Várias outras classes de suporte, como adaptadores de tabela para cada uma das tabelas escolhidas, também são adicionadas.
Para adicionar a fonte de dados
No menu
Dados, selecione Adicionar Nova Fonte de Dados .No Data Source Configuration Wizard, crie uma conexão com o banco de dados Northwind usando um conjunto de dados. Para obter mais informações, consulte Como conectar-se a dados em um banco de dados.
Quando for solicitado pelo Assistente de Configuração da Fonte de Dados , guarde a cadeia de ligação como
NorthwindConnectionString
.Importante
O armazenamento de informações confidenciais, como uma senha, na cadeia de conexão pode afetar a segurança do seu aplicativo. Usar a Autenticação do Windows, também conhecida como segurança integrada, é uma maneira mais segura de controlar o acesso a um banco de dados. Para obter mais informações, consulte Protegendo informações de conexão.
Quando for solicitado a escolher seus objetos de banco de dados, selecione as tabelas
Customers
eOrders
e nomeie o conjunto de dados geradoNorthwindDataSet
.
Vinculação à fonte de dados
O componente System.Windows.Forms.BindingSource fornece uma interface uniforme para a fonte de dados do aplicativo. A vinculação à fonte de dados é implementada no arquivo code-behind.
Para vincular à fonte de dados
Abra o arquivo code-behind, chamado MainWindow.xaml.vb ou MainWindow.xaml.cs.
Copie o código a seguir para a definição de classe
MainWindow
.Este código declara o componente BindingSource e as classes auxiliares associadas que se conectam ao banco de dados.
private System.Windows.Forms.BindingSource nwBindingSource; private NorthwindDataSet nwDataSet; private NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = new NorthwindDataSetTableAdapters.CustomersTableAdapter(); private NorthwindDataSetTableAdapters.OrdersTableAdapter ordersTableAdapter = new NorthwindDataSetTableAdapters.OrdersTableAdapter();
Private nwBindingSource As System.Windows.Forms.BindingSource Private nwDataSet As NorthwindDataSet Private customersTableAdapter As New NorthwindDataSetTableAdapters.CustomersTableAdapter() Private ordersTableAdapter As New NorthwindDataSetTableAdapters.OrdersTableAdapter()
Copie o código a seguir para o construtor.
Este código cria e inicializa o componente BindingSource.
public MainWindow() { InitializeComponent(); // Create a DataSet for the Customers data. this.nwDataSet = new NorthwindDataSet(); this.nwDataSet.DataSetName = "nwDataSet"; // Create a BindingSource for the Customers data. this.nwBindingSource = new System.Windows.Forms.BindingSource(); this.nwBindingSource.DataMember = "Customers"; this.nwBindingSource.DataSource = this.nwDataSet; }
Public Sub New() InitializeComponent() ' Create a DataSet for the Customers data. Me.nwDataSet = New NorthwindDataSet() Me.nwDataSet.DataSetName = "nwDataSet" ' Create a BindingSource for the Customers data. Me.nwBindingSource = New System.Windows.Forms.BindingSource() Me.nwBindingSource.DataMember = "Customers" Me.nwBindingSource.DataSource = Me.nwDataSet End Sub
Abra MainWindow.xaml.
No modo Design ou XAML, selecione o elemento Window.
Na janela Propriedades, clique na guia Eventos.
Clique duas vezes no evento Loaded.
Copie o código a seguir para o manipulador de eventos Loaded.
Esse código atribui o componente BindingSource como o contexto de dados e preenche os objetos
Customers
eOrders
adaptador.private void Window_Loaded(object sender, RoutedEventArgs e) { // Fill the Customers table adapter with data. this.customersTableAdapter.ClearBeforeFill = true; this.customersTableAdapter.Fill(this.nwDataSet.Customers); // Fill the Orders table adapter with data. this.ordersTableAdapter.Fill(this.nwDataSet.Orders); // Assign the BindingSource to // the data context of the main grid. this.mainGrid.DataContext = this.nwBindingSource; // Assign the BindingSource to // the data source of the list box. this.listBox1.ItemsSource = this.nwBindingSource; // Because this is a master/details form, the DataGridView // requires the foreign key relating the tables. this.dataGridView1.DataSource = this.nwBindingSource; this.dataGridView1.DataMember = "FK_Orders_Customers"; // Handle the currency management aspect of the data models. // Attach an event handler to detect when the current item // changes via the WPF ListBox. This event handler synchronizes // the list collection with the BindingSource. // BindingListCollectionView cv = CollectionViewSource.GetDefaultView( this.nwBindingSource) as BindingListCollectionView; cv.CurrentChanged += new EventHandler(WPF_CurrentChanged); }
Private Sub Window_Loaded( _ ByVal sender As Object, _ ByVal e As RoutedEventArgs) ' Fill the Customers table adapter with data. Me.customersTableAdapter.ClearBeforeFill = True Me.customersTableAdapter.Fill(Me.nwDataSet.Customers) ' Fill the Orders table adapter with data. Me.ordersTableAdapter.Fill(Me.nwDataSet.Orders) ' Assign the BindingSource to ' the data context of the main grid. Me.mainGrid.DataContext = Me.nwBindingSource ' Assign the BindingSource to ' the data source of the list box. Me.listBox1.ItemsSource = Me.nwBindingSource ' Because this is a master/details form, the DataGridView ' requires the foreign key relating the tables. Me.dataGridView1.DataSource = Me.nwBindingSource Me.dataGridView1.DataMember = "FK_Orders_Customers" ' Handle the currency management aspect of the data models. ' Attach an event handler to detect when the current item ' changes via the WPF ListBox. This event handler synchronizes ' the list collection with the BindingSource. ' Dim cv As BindingListCollectionView = _ CollectionViewSource.GetDefaultView(Me.nwBindingSource) AddHandler cv.CurrentChanged, AddressOf WPF_CurrentChanged End Sub
Copie o código a seguir para a definição de classe
MainWindow
.Esse método manipula o evento CurrentChanged e atualiza o item atual da associação de dados.
// This event handler updates the current item // of the data binding. void WPF_CurrentChanged(object sender, EventArgs e) { BindingListCollectionView cv = sender as BindingListCollectionView; this.nwBindingSource.Position = cv.CurrentPosition; }
' This event handler updates the current item ' of the data binding. Private Sub WPF_CurrentChanged(ByVal sender As Object, ByVal e As EventArgs) Dim cv As BindingListCollectionView = sender Me.nwBindingSource.Position = cv.CurrentPosition End Sub
Pressione F5 para criar e executar o aplicativo.
Ver também
.NET Desktop feedback