How to: Bind Data Using a Project Data Source (WCF Data Services)
Important
WCF Data Services has been deprecated and will no longer be available for download from the Microsoft Download Center. WCF Data Services supported earlier versions of the Microsoft OData (V1-V3) protocol only and has not been under active development. OData V1-V3 has been superseded by OData V4, which is an industry standard published by OASIS and ratified by ISO. OData V4 is supported through the OData V4 compliant core libraries available at Microsoft.OData.Core. Support documentation is available at OData.Net, and the OData V4 service libraries are available at Microsoft.AspNetCore.OData.
RESTier is the successor to WCF Data Services. RESTier helps you bootstrap a standardized, queryable, HTTP-based REST interface in minutes. Like WCF Data Services before it, Restier provides simple and straightforward ways to shape queries and intercept submissions before and after they hit the database. And like Web API + OData, you still have the flexibility to add your own custom queries and actions with techniques you're already familiar with.
You can create data sources that are based on the generated data objects in an WCF Data Services client application. When you add a reference to a data service by using the Add Service Reference dialog, a project data source is created along with the generated client data classes. One data source is created for each entity set that the data service exposes. You can create forms that display data from the service by dragging these data source items from the Data Sources window onto the designer. These items become controls that are bound to the data source. During execution, this data source is bound to an instance of the DataServiceCollection<T> class, which is filled with objects that are returned by a query to the data service. For more information, see Binding Data to Controls.
The examples in this topic use the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the WCF Data Services quickstart.
Use a project data source in a WPF window
In Visual Studio, in a WPF project, add a reference to the Northwind data service. For more information, see How to: Add a Data Service Reference.
In the Data Sources window, expand the
Customers
node in the NorthwindEntities project data source.Click the CustomerID item, select ComboBox from the list, and drag the CustomerID item from the Customers node to the designer.
This creates the following object elements in the XAML file for the window:
A CollectionViewSource element named
customersViewSource
. The DataContext property of the top-level Grid object element is set to this new CollectionViewSource.A data-bound ComboBox named
CustomerID
.A Label.
Drag the Orders navigation property to the designer.
This creates the following additional object elements in the XAML file for the window:
A second CollectionViewSource element named
customersOrdersViewSource
, the source of which is thecustomerViewSource
.A data-bound DataGrid control named
ordersDataGrid
.
(Optional) Drag additional items from the Customers node to the designer.
Open the code page for the form and add the following
using
statements (Imports
in Visual Basic):using System.Data.Services.Client; using NorthwindClient.Northwind;
In the partial class that defines the form, add the following code that creates an ObjectContext instance and defines the
customerID
constant.private NorthwindEntities context; private CollectionViewSource customersViewSource; private DataServiceCollection<Customer> trackedCustomers; private const string customerCountry = "Germany"; private const string svcUri = "http://localhost:12345/Northwind.svc/";
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 = "http://localhost:12345/Northwind.svc/"
In the designer, select the window.
Note
Make sure that you select the window itself, rather than selecting content that is within the window. If the window is selected, the Name text box near the top of the Properties window should contain the name of the window.
In the Properties window, select the Events button.
Find the Loaded event, and then double-click the drop-down list next to this event.
Visual Studio opens the code-behind file for the window and generates a Loaded event handler.
In the newly created Loaded event handler, copy and paste the following code.
// 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()); }
' 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:{vbCrLf}{ex.ToString()}") Catch ex As InvalidOperationException MessageBox.Show($"The following error occurred:{vbCrLf}{ex.ToString()}") End Try
This code creates an instance of DataServiceCollection<T> for the
Customers
type based on the execution of a LINQ query that returns an IEnumerable<T> ofCustomers
along with relatedOrders
objects from the Northwind data service and binds it to thecustomersViewSource
.
Use a project data source in a Windows form
In the Data Sources window, expand the Customers node in the NorthwindEntities project data source.
Click the CustomerID item, select ComboBox from the list, and drag the CustomerID item from the Customers node to the designer.
This creates the following controls on the form:
An instance of BindingSource named
customersBindingSource
.An instance of BindingNavigator named
customersBindingNavigator
. You can delete this control as it will not be needed.A data-bound ComboBox named
CustomerID
.A Label.
Drag the Orders navigation property to the form.
This creates the
ordersBindingSource
control with the DataSource property of the control set to thecustomersBindingSource
and the DataMember property set toCustomers
. It also creates theordersDataGridView
data-bound control on the form, accompanied by an appropriately titled label control.(Optional) Drag additional items from the Customers node to the designer.
Open the code page for the form and add the following
using
statements (Imports
in Visual Basic):using System.Data.Services.Client; using NorthwindClient.Northwind;
Imports System.Data.Services.Client Imports NorthwindClient.Northwind
In the partial class that defines the form, add the following code that creates an ObjectContext instance and defines the
customerID
constant.private NorthwindEntities context; private DataServiceCollection<Customer> trackedCustomers; private const string customerCountry = "Germany"; private const string svcUri = "http://localhost:12345/Northwind.svc/";
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/"
In the form designer, double-click the form.
This opens the code page for the form and creates the method that handles the
Load
event for the form.In the
Load
event handler, copy and paste the following code.// 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()); }
' 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())
This code creates an instance of DataServiceCollection<T> for the
Customers
type based on the execution of a DataServiceQuery<TElement> that returns an IEnumerable<T> ofCustomers
from the Northwind data service and binds it to thecustomersBindingSource
.