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)