Partager via


Procédure : lier des objets à des contrôles Windows Presentation Foundation (Entity Framework)

Entity Framework permet de lier des éléments Windows Presentation Foundation (WPF), tels qu'un objet ListBox ou ComboBox, à un objet EntityCollection ou à un résultat ObjectQuery. Nous vous recommandons de ne pas lier directement des contrôles à un objet ObjectQuery. Il est préférable de les lier au résultat de la méthode Execute. Si vous préférez utiliser des requêtes LINQ, nous vous recommandons d'effectuer un cast du résultat de la requête en ObjectQuery et d'appeler la méthode Execute.

Pour plus d'informations, consultez 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 les fichiers du modèle et les fichiers de mappage (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 System.Linq
Imports Microsoft.Samples.Edm

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)

            ' Instantiate the ObjectContext.
            context = New AdventureWorksEntities()

            ' Define a query that returns orders for a customer.
            ' Because lazy loading is on by default, SalesOrderDetails
            ' related to a SalesOrderHeader will be loaded when the query
            ' is executed.
            Dim query = From o In context.SalesOrderHeaders Where o.CustomerID = customerId

            ' Execute the query and bind the result to the OrderItems control.
            Me.orderItemsGrid.DataContext = CType(query, ObjectQuery).Execute(MergeOption.AppendOnly)
        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 System.Linq;

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)
        {
            // Instantiate the ObjectContext.
            context = new AdventureWorksEntities();

            // Define a query that returns orders for a customer.
            // Because lazy loading is on by default, SalesOrderDetails
            // related to a SalesOrderHeader will be loaded when the query
            // is executed.
            var query = from o in context.SalesOrderHeaders
                         where o.CustomerID == customerId
                         select o;

            // Execute the query and bind the result to the OrderItems control.
            this.orderItemsGrid.DataContext = ((ObjectQuery)query).Execute(MergeOption.AppendOnly);
        }

        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=SalesOrderDetails}" 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

Utilisation d'objets (Entity Framework)
Liaison d'objets à des contrôles (Entity Framework)

Autres ressources

Vue d'ensemble de la liaison de données (WPF)