Cómo: Enlazar objetos a controles de Windows Presentation Foundation (Entity Framework)
Entity Framework permite enlazar elementos de Windows Presentation Foundation (WPF), tales como un control ListBox o ComboBox, a una EntityCollection o a un resultado de ObjectQuery. Se recomienda no enlazar controles directamente a ObjectQuery. En su lugar, enlace controles al resultado del método Execute. Si prefiere trabajar con consultas LINQ, recomendamos convertir el resultado de la consulta a ObjectQuery y llamar al 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 Adventure Works 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 los archivos de asignación y modelo (Entity Framework).
Ejemplo
El ejemplo siguiente es de la página de código subyacente de una página de lenguaje 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 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();
}
}
}
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=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>
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
Trabajar con objetos (Entity Framework)
Enlazar objetos a controles (Entity Framework)