Cómo enlazar objetos a controles de Windows Presentation Foundation (Entity Framework)

Servicios de objeto permite enlazar los elementos Windows Presentation Foundation (WPF) como un ListBox****o ComboBox a EntityCollection o a un resultado ObjectQuery. Se recomienda no enlazar controles directamente a ObjectQuery. En su lugar, enlace controles al resultado del método Execute. Para obtener más información, vea Enlazar objetos a controles (Entity Framework).

El ejemplo de este tema se basa en el modelo AdventureWorks Sales. Para ejecutar el código de este ejemplo, debe haber agregado el modelo AdventureWorks Sales al proyecto y haber configurado el proyecto para usar Entity Framework. Para ello, complete los procedimientos de Cómo configurar manualmente un proyecto de Entity Framework y Cómo definir manualmente un modelo Entity Data Model (Entity Framework).

Ejemplo

El ejemplo siguiente es de la página de código subyacente de una página de Lenguaje de marcado de aplicaciones extensible (XAML) que define la ventana SalesOrders en WPF. Cuando se carga la ventana, se devuelve un ObjectResult de objetos SalesOrderHeader y SalesOrderDetail relacionados llamando al método Execute de ObjectQuery. Este resultado se enlaza a la propiedad DataContext de un control 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();
        }
    }
}

El siguiente es el XAML que define la ventana SalesOrders en WPF. La propiedad ItemsSource de un ComboBox se enlaza al origen de datos ObjectResult<SalesOrderHeader> que se define en la página de código subyacente. Cuando se selecciona un pedido, la EntityCollection de los objetos SalesOrderDetail se enlaza al ListView que se especifica mediante la propiedad ItemsSource. Con el valor de ruta de acceso Path=SalesOrderDetail en el enlace se asegura de que ListView se enlaza a la propiedad SalesOrderDetail que devuelve una 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>

Vea también

Tareas

Cómo enlazar objetos a controles de Windows Forms (Entity Framework)
Cómo agregar un objeto como origen de datos del proyecto (Entity Framework)

Conceptos

Enlazar datos de entidad a controles (escenarios de aplicación)
Enlazar objetos a controles (Entity Framework)
Enlazar datos de entidad a controles (escenarios de aplicación)

Otros recursos

Trabajar con objetos (tareas de Entity Framework)
Introducción al enlace de datos (WPF)