Procédure : lier des objets à des contrôles Windows Presentation Foundation (Entity Framework)
Object Services vous permet de lier des éléments Windows Presentation Foundation (WPF) tel qu'un ListBox**** ou ComboBox à un EntityCollection ou à un résultat d'ObjectQuery. Nous vous recommandons de ne pas lier directement des contrôles à un ObjectQuery. Il est préférable de les lier au résultat de la méthode Execute. Pour plus d'informations, voir Liaison d'objets à des contrôles (Entity Framework).
L'exemple de cette rubrique est basé sur le modèle de vente Adventure Works Sales Model. Pour exécuter le code de cet exemple, vous devez déjà avoir ajouté le modèle de vente AdventureWorks Sales Model à votre projet et configuré ce dernier pour qu'il utilise Entity Framework. Pour cela, exécutez les procédures décrites dans Procédure : configurer manuellement un projet Entity Framework et Procédure : définir manuellement un modèle EDM (Entity Data Model) (Entity Framework).
Exemple
L'exemple suivant provient de la page code-behind d'une page XAML (Extensible Application Markup Language) qui définit la fenêtre SalesOrders dans WPF. Lorsque la fenêtre est chargée, un ObjectResult d'objets SalesOrderHeader et SalesOrderDetail connexes est retourné en appelant la méthode Execute du ObjectQuery. Le résultat est lié à la propriété DataContext d'un contrôle Grid.
Imports System
Imports System.Data
Imports System.Data.Objects
Imports System.Windows
Imports Microsoft.Samples.Edm
Imports Microsoft.Samples.Edm.AdventureWorksModel
Namespace Microsoft.Samples.Edm
Partial Public Class SalesOrders
Inherits Window
Private context As AdventureWorksEntities
Private customerId As Integer = 277
Private Sub SalesOrdersForm_Loaded( _
ByVal sender As Object, ByVal e As RoutedEventArgs)
Try
' Instantiate the ObjectContext.
context = New AdventureWorksEntities()
' Define a query that returns orders for a customer.
Dim query As ObjectQuery(Of SalesOrderHeader) = context.SalesOrderHeader _
.Where("it.customerID = @customerid", _
New ObjectParameter("customerid", customerId)) '_
'.Include("SalesOrderDetail")
' Execute the query and bind the result to the OrderItems control.
Me.orderItemsGrid.DataContext = query.Execute(MergeOption.AppendOnly)
Catch ex As EntitySqlException
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub buttonClose_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Me.Close()
End Sub
Public Sub New()
InitializeComponent()
End Sub
End Class
End Namespace
using System;
using System.Data;
using System.Data.Objects;
using System.Windows;
using AdventureWorksModel;
namespace Microsoft.Samples.Edm
{
/// <summary>
/// Interaction logic for SalesOrders.xaml
/// </summary>
public partial class SalesOrders : Window
{
private AdventureWorksEntities context;
private int customerId = 277;
private void SalesOrdersForm_Loaded(object sender, RoutedEventArgs e)
{
try
{
// Instantiate the ObjectContext.
context = new AdventureWorksEntities();
// Define a query that returns orders for a customer.
ObjectQuery<SalesOrderHeader> query = context.SalesOrderHeader
.Where("it.customerID = @customerid",
new ObjectParameter("customerid", customerId))
.Include("SalesOrderDetail");
// Execute the query and bind the result to the OrderItems control.
this.orderItemsGrid.DataContext = query.Execute(MergeOption.AppendOnly);
}
catch (EntitySqlException ex)
{
MessageBox.Show(ex.Message);
}
}
private void buttonClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
public SalesOrders()
{
InitializeComponent();
}
}
}
Vous trouverez ci-après le XAML qui définit la fenêtre SalesOrders dans WPF. La propriété ItemsSource d'un ComboBox est liée à la source de données ObjectResult<SalesOrderHeader> définie dans la page code-behind. Lorsqu'une commande est sélectionnée, l'EntityCollection associé d'objets SalesOrderDetail est lié au ListView spécifié par la propriété ItemsSource. La valeur de chemin d'accès Path=SalesOrderDetail
dans la liaison garantit que le ListView est lié à la propriété SalesOrderDetail qui retourne un EntityCollection.
<Window x:Class="Microsoft.Samples.Edm.SalesOrders"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="Customer Sales Orders" Height="335" Width="425"
Name="SalesOrdersForm" Loaded="SalesOrdersForm_Loaded">
<Grid Name="orderItemsGrid">
<ComboBox DisplayMemberPath="SalesOrderID" ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="true"
Height="23" Margin="122,12,198,0" Name="comboBoxOrder" VerticalAlignment="Top"/>
<ListView ItemsSource="{Binding Path=SalesOrderDetail}" Name="listViewItems" Margin="34,46,34,50">
<ListView.View>
<GridView AllowsColumnReorder="False" ColumnHeaderToolTip="Line Items">
<GridViewColumn DisplayMemberBinding="{Binding Path=ProductID}"
Header="Product" Width="50"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=OrderQty}"
Header="Quantity" Width="50"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=UnitPrice}"
Header="Cost" Width="50"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=LineTotal}"
Header="Line Total" Width="80"/>
</GridView>
</ListView.View>
</ListView>
<Label Height="28" Margin="34,12,0,0" Name="orderLabel" VerticalAlignment="Top"
HorizontalAlignment="Left" Width="93">Order:</Label>
<Button Height="23" HorizontalAlignment="Right" Margin="0,0,12,12"
Name="buttonClose" VerticalAlignment="Bottom" Width="75" Click="buttonClose_Click">Close</Button>
</Grid>
</Window>
Voir aussi
Tâches
Procédure : lier des objets à des contrôles Windows Form (Entity Framework)
Procédure : ajouter un objet en tant que source de données de projet (Entity Framework)
Concepts
Lier des données d'entité à des contrôles (Scénarios d'application)
Liaison d'objets à des contrôles (Entity Framework)
Lier des données d'entité à des contrôles (Scénarios d'application)
Autres ressources
Utilisation d'objets (Tâches Entity Framework)
Vue d'ensemble de la liaison de données (WPF)