Cómo: Enlazar datos mediante un origen de datos del proyecto (WCF Data Services)
Puede crear orígenes de datos basados en los objetos de datos generados en una aplicación cliente de WCF Data Services . Cuando se agrega una referencia a un servicio de datos usando el cuadro de diálogo Agregar referencia de servicio, se crea un origen de datos del proyecto junto con las clases generadas de datos del cliente. Para cada conjunto de entidades expuesto por el servicio de datos se crea un origen de datos. Puede crear formularios que muestran datos procedentes del servicio arrastrando estos elementos del origen de datos desde la ventana Orígenes de datos al diseñador. Estos elementos se convierten en controles enlazados al origen de datos. Durante la ejecución, este origen de datos se enlaza a una instancia de la clase DataServiceCollection, que se rellena con los objetos devueltos por una consulta al servicio de datos. Para obtener más información, vea Enlazar datos a controles (WCF Data Services).
En los ejemplos de este tema se usa el servicio de datos de ejemplo Northwind y las clases del servicio de datos del cliente generadas automáticamente. Se crean este servicio y las clases de datos del cliente al completar el tutorial rápido de WCF Data Services.
Para usar un origen de datos del proyecto en una ventana de WPF
En un proyecto WPF, agregue una referencia al servicio de datos de Northwind. Para obtener más información, vea Cómo: Agregar una referencia a un servicio de datos (WCF Data Services).
En la ventana Orígenes de datos, expanda el nodo
Customers
del origen de datos del proyecto NorthwindEntities.Haga clic en el elemento CustomerID, seleccione ComboBox en la lista y arrastre el elemento CustomerID desde el nodo Customers al diseñador.
Con ello se crean los siguientes elementos de objeto en el archivo XAML de la ventana:
Un elemento CollectionViewSource denominado
customersViewSource
. La propiedad DataContext del elemento de objeto Grid de nivel superior se establece en este nuevo elemento CollectionViewSource.Un control ComboBox enlazado a datos denominado
CustomerID
.Un control Label.
Arrastre la propiedad de navegación Orders al diseñador.
Con ello se crean los siguientes elementos de objeto adicionales en el archivo XAML de la ventana:
Un segundo elemento CollectionViewSource denominado
customersOrdersViewSource
, cuyo origen escustomerViewSource
.Un control DataGrid enlazado a datos denominado
ordersDataGrid
.
(Opcional) Arrastre elementos adicionales desde el nodo Customers al diseñador.
Abra la página de código del formulario y agregue las instrucciones using siguientes (Imports en Visual Basic):
using System.Data.Services.Client; using NorthwindClient.Northwind;
En la clase parcial que define el formulario, agregue el código siguiente que crea una instancia de ObjectContext y define la constante
customerID
.Private context As NorthwindEntities Private customersViewSource As CollectionViewSource Private trackedCustomers As DataServiceCollection(Of Customer) Private Const customerCountry As String = "Germany" Private Const svcUri As String = "https://localhost:12345/Northwind.svc/"
private NorthwindEntities context; private CollectionViewSource customersViewSource; private DataServiceCollection<Customer> trackedCustomers; private const string customerCountry = "Germany"; private const string svcUri = "https://localhost:12345/Northwind.svc/";
En el diseñador, seleccione la ventana.
Nota: Asegúrese de que selecciona la ventana, y no el contenido situado dentro de ella.Cuando está seleccionada la ventana, el cuadro de texto Nombre situado cerca de la parte superior de la ventana Propiedades debería contener el nombre de la ventana. En la ventana Propiedades, seleccione el botón Eventos.
Busque el evento Loaded y, a continuación, haga doble clic en la lista desplegable situada junto a este evento.
Visual Studio abre el archivo de código subyacente para la ventana y genera un controlador de eventos Loaded.
En el controlador de eventos Loaded que se acaba de crear, copie y pegue el código siguiente.
' Initialize the context for the data service. context = New NorthwindEntities(New Uri(svcUri)) ' Create a LINQ query that returns customers with related orders. Dim customerQuery = From cust In context.Customers.Expand("Orders") _ Where cust.Country = customerCountry _ Select cust ' Create a new collection for binding based on the LINQ query. trackedCustomers = New DataServiceCollection(Of Customer)(customerQuery) try ' Get the customersViewSource resource and set the binding to the collection. customersViewSource = _ CType(Me.FindResource("customersViewSource"), CollectionViewSource) customersViewSource.Source = trackedCustomers customersViewSource.View.MoveCurrentToFirst() Catch ex As DataServiceQueryException MessageBox.Show("The query could not be completed:\n" + ex.ToString()) Catch ex As InvalidOperationException MessageBox.Show("The following error occurred:\n" + ex.ToString()) End Try
// Initialize the context for the data service. context = new NorthwindEntities(new Uri(svcUri)); // Create a LINQ query that returns customers with related orders. var customerQuery = from cust in context.Customers.Expand("Orders") where cust.Country == customerCountry select cust; // Create a new collection for binding based on the LINQ query. trackedCustomers = new DataServiceCollection<Customer>(customerQuery); try { // Get the customersViewSource resource and set the binding to the collection. customersViewSource = ((CollectionViewSource)(this.FindResource("customersViewSource"))); customersViewSource.Source = trackedCustomers; customersViewSource.View.MoveCurrentToFirst(); } catch (DataServiceQueryException ex) { MessageBox.Show("The query could not be completed:\n" + ex.ToString()); } catch (InvalidOperationException ex) { MessageBox.Show("The following error occurred:\n" + ex.ToString()); }
Este código crea una instancia de DataServiceCollection para el tipo
Customers
basándose en la ejecución de una consulta LINQ que devuelve una interfaz IEnumerable deCustomers
junto con los objetosOrders
relacionados desde el servicio de datos de Northwind y la enlaza con el elementocustomersViewSource
.
Para usar un origen de datos del proyecto en un formulario de Windows
En la ventana Orígenes de datos, expanda el nodo Customers del origen de datos del proyecto NorthwindEntities.
Haga clic en el elemento CustomerID, seleccione ComboBox en la lista y arrastre el elemento CustomerID desde el nodo Customers al diseñador.
De esta forma se crean los controles siguientes en el formulario:
Una instancia de BindingSource denominada
customersBindingSource
.Una instancia de BindingNavigator denominada
customersBindingNavigator
. Puede eliminar este control, dado que no será necesario.Un control ComboBox enlazado a datos denominado
CustomerID
.Un control Label.
Arrastre la propiedad de navegación Orders al formulario.
De esta forma se crea el control
ordersBindingSource
con la propiedad DataSource del control establecida encustomersBindingSource
y la propiedad DataMember establecida enCustomers
. También se crea el control enlazado a datosordersDataGridView
en el formulario, acompañado de un control de etiqueta con el título apropiado.(Opcional) Arrastre elementos adicionales desde el nodo Customers al diseñador.
Abra la página de código del formulario y agregue las instrucciones using siguientes (Imports en Visual Basic):
Imports System.Data.Services.Client Imports NorthwindClient.Northwind
using System.Data.Services.Client; using NorthwindClient.Northwind;
En la clase parcial que define el formulario, agregue el código siguiente que crea una instancia de ObjectContext y define la constante
customerID
.Private context As NorthwindEntities Private trackedCustomers As DataServiceCollection(Of Customer) Private Const customerCountry As String = "Germany" Private Const svcUri As String = "http:'localhost:12345/Northwind.svc/"
private NorthwindEntities context; private DataServiceCollection<Customer> trackedCustomers; private const string customerCountry = "Germany"; private const string svcUri = "https://localhost:12345/Northwind.svc/";
En el diseñador de formularios, haga doble clic en el formulario.
De esta forma se abre la página de código del formulario y se crea el método que administra el evento
Load
para el formulario.En el controlador de eventos
Load
, copie y pegue el código siguiente.' Initialize the context for the data service. context = New NorthwindEntities(New Uri(svcUri)) Try ' Create a LINQ query that returns customers with related orders. Dim customerQuery = From cust In context.Customers.Expand("Orders") _ Where cust.Country = customerCountry _ Select cust ' Create a new collection for binding based on the LINQ query. trackedCustomers = New DataServiceCollection(Of Customer)(customerQuery) 'Bind the Customers combobox to the collection. customersComboBox.DisplayMember = "CustomerID" customersComboBox.DataSource = trackedCustomers Catch ex As DataServiceQueryException MessageBox.Show("The query could not be completed:\n" + ex.ToString()) Catch ex As InvalidOperationException MessageBox.Show("The following error occurred:\n" + ex.ToString())
// Initialize the context for the data service. context = new NorthwindEntities(new Uri(svcUri)); try { // Create a LINQ query that returns customers with related orders. var customerQuery = from cust in context.Customers.Expand("Orders") where cust.Country == customerCountry select cust; // Create a new collection for binding based on the LINQ query. trackedCustomers = new DataServiceCollection<Customer>(customerQuery); //Bind the Customers combobox to the collection. customersComboBox.DisplayMember = "CustomerID"; customersComboBox.DataSource = trackedCustomers; } catch (DataServiceQueryException ex) { MessageBox.Show("The query could not be completed:\n" + ex.ToString()); } catch (InvalidOperationException ex) { MessageBox.Show("The following error occurred:\n" + ex.ToString()); }
Este código crea una instancia de DataServiceCollection para el tipo
Customers
basándose en la ejecución de una instancia de DataServiceQuery que devuelve una interfaz IEnumerable deCustomers
desde el servicio de datos de Northwind y la enlaza con el elementocustomersBindingSource
.
Vea también
Tareas
Cómo: Enlazar datos a los elementos de Windows Presentation Foundation (WCF Data Services)