Как привязать данные с помощью источника данных проекта (службы данных WCF Data Services)
Существует возможность создания источников данных на основе объектов данных, формируемых клиентским приложением Службы WCF Data Services . При добавлении ссылки на службу данных с помощью диалога Добавление ссылки на службу вместе со сформированными клиентскими классами данных создается источник данных проекта. Для каждого набора сущностей, предоставляемого службой данных, создается один источник данных. Формы для отображения данных службы данных можно создать путем перетаскивания этих элементов источника данных из окна Источники данных на окно конструктора. Эти элементы становятся элементами управления, привязанными к источнику данных. Во время выполнения источник данных привязывается к экземпляру класса DataServiceCollection, который заполняется объектами, возвращаемыми в ответ на запрос к службе данных. Дополнительные сведения см. в разделе Привязка данных к элементам управления (службы WCF Data Services).
Примеры в этом разделе используют образец службы данных Northwind и автоматически сформированные клиентские классы службы данных. Эта служба и клиентские классы данных создаются после выполнения действий, описанных в разделе Краткое руководство по службам WCF Data Services.
Использование источника данных проекта в окне WPF
Добавьте в проект WPF ссылку на службу данных Northwind. Дополнительные сведения см. в разделе Как добавить ссылку на службу данных (службы WCF Data Services).
Разверните в окне Источники данных узел
Customers
в источнике данных проекта NorthwindEntities.Щелкните элемент CustomerID, выберите из списка элемент ComboBox и перетащите элемент CustomerID из узла Customers в конструктор.
При этом в файле XAML для данного окна будут созданы следующие элементы объектов:
Элемент CollectionViewSource с именем
customersViewSource
. Свойству DataContext элемента объекта верхнего уровня Grid присваивается значение нового объекта CollectionViewSource.Привязанный к данным элемент ComboBox с именем
CustomerID
.Элемент Label.
Перетащите в окно конструктора навигационное свойство Orders.
При этом в файле XAML для данного окна будут созданы следующие дополнительные элементы объектов:
Второй элемент CollectionViewSource с именем
customersOrdersViewSource
, источником для которого является объектcustomerViewSource
.Привязанный к данным элемент управления DataGrid с именем
ordersDataGrid
.
Перетащите дополнительные элементы из узла Customers в конструктор. (Необязательно.)
Откройте кодовую страницу формы и добавьте следующие инструкции using (Imports в Visual Basic):
using System.Data.Services.Client; using NorthwindClient.Northwind;
В разделяемый класс, определяющий форму, добавьте следующий код, который создает экземпляр объекта ObjectContext и определяет константу
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/";
В конструкторе выберите окно.
Примечание
Убедитесь, что выбрано само окно, а не содержимое этого окна.Если окно выбрано, текстовое поле Имя в верхней части окна Свойства должно содержать имя окна. В окне Свойства нажмите кнопку События.
Найдите событие Загружено, затем дважды щелкните раскрывающийся список рядом с этим событием.
Visual Studio открывает файл с фоновым кодом для окна и формирует обработчик события Loaded.
Скопируйте и вставьте во вновь созданный обработчик события Loaded следующий код.
' 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()); }
Этот код создает экземпляр DataServiceCollection для типа
Customers
на основе выполнения запроса LINQ, который возвращает интерфейс IEnumerable объектаCustomers
вместе со связанными объектамиOrders
из службы данных Northwind и привязывает его к объектуcustomersViewSource
.
Использование источника данных проекта в форме Windows
Разверните в окне Источники данных узел Customers в источнике данных проекта NorthwindEntities.
Щелкните элемент CustomerID, выберите из списка элемент ComboBox и перетащите элемент CustomerID из узла Customers в конструктор.
Это приведет к созданию следующих элементов управления в форме:
Экземпляр BindingSource с именем
customersBindingSource
.Экземпляр BindingNavigator с именем
customersBindingNavigator
. Этот элемент управления можно удалить, так как он не понадобится.Привязанный к данным элемент ComboBox с именем
CustomerID
.Элемент Label.
Перетащите в форму навигационное свойство Orders.
Это приведет к созданию элемента управления
ordersBindingSource
и присваиванию свойству DataSource этого элемента управления значенияcustomersBindingSource
, а свойству DataMember — значенияCustomers
. Кроме того, в форме будет создан привязанный к данным элемент управленияordersDataGridView
в сочетании с элементом управления меткой, имеющим соответствующий заголовок.Перетащите дополнительные элементы из узла Customers в конструктор. (Необязательно.)
Откройте кодовую страницу формы и добавьте следующие инструкции using (Imports в Visual Basic):
Imports System.Data.Services.Client Imports NorthwindClient.Northwind
using System.Data.Services.Client; using NorthwindClient.Northwind;
В разделяемый класс, определяющий форму, добавьте следующий код, который создает экземпляр объекта ObjectContext и определяет константу
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/";
В конструкторе форм дважды щелкните форму.
После этого будет открыта страница кода формы и создан метод обработчика события
Load
для этой формы.Скопируйте и вставьте в обработчике события
Load
следующий код.' 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()); }
Этот код создает экземпляр DataServiceCollection для типа
Customers
на основе выполнения запроса DataServiceQuery, который возвращает интерфейс IEnumerable объектаCustomers
из службы данных Northwind и привязывает его к объектуcustomersBindingSource
.
См. также
Задачи
Как привязать данные к элементам Windows Presentation Foundation (службы WCF Data Services)