Поделиться через


Как привязать данные с помощью источника данных проекта (службы данных WCF Data Services)

Существует возможность создания источников данных на основе объектов данных, формируемых клиентским приложением Службы WCF Data Services . При добавлении ссылки на службу данных с помощью диалога Добавление ссылки на службу вместе со сформированными клиентскими классами данных создается источник данных проекта. Для каждого набора сущностей, предоставляемого службой данных, создается один источник данных. Формы для отображения данных службы данных можно создать путем перетаскивания этих элементов источника данных из окна Источники данных на окно конструктора. Эти элементы становятся элементами управления, привязанными к источнику данных. Во время выполнения источник данных привязывается к экземпляру класса DataServiceCollection, который заполняется объектами, возвращаемыми в ответ на запрос к службе данных. Дополнительные сведения см. в разделе Привязка данных к элементам управления (службы WCF Data Services).

Примеры в этом разделе используют образец службы данных Northwind и автоматически сформированные клиентские классы службы данных. Эта служба и клиентские классы данных создаются после выполнения действий, описанных в разделе Краткое руководство по службам WCF Data Services.

Использование источника данных проекта в окне WPF

  1. Добавьте в проект WPF ссылку на службу данных Northwind. Дополнительные сведения см. в разделе Как добавить ссылку на службу данных (службы WCF Data Services).

  2. Разверните в окне Источники данных узел Customers в источнике данных проекта NorthwindEntities.

  3. Щелкните элемент CustomerID, выберите из списка элемент ComboBox и перетащите элемент CustomerID из узла Customers в конструктор.

    При этом в файле XAML для данного окна будут созданы следующие элементы объектов:

    • Элемент CollectionViewSource с именем customersViewSource. Свойству DataContext элемента объекта верхнего уровня Grid присваивается значение нового объекта CollectionViewSource.

    • Привязанный к данным элемент ComboBox с именем CustomerID.

    • Элемент Label.

  4. Перетащите в окно конструктора навигационное свойство Orders.

    При этом в файле XAML для данного окна будут созданы следующие дополнительные элементы объектов:

    • Второй элемент CollectionViewSource с именем customersOrdersViewSource, источником для которого является объект customerViewSource.

    • Привязанный к данным элемент управления DataGrid с именем ordersDataGrid.

  5. Перетащите дополнительные элементы из узла Customers в конструктор. (Необязательно.)

  6. Откройте кодовую страницу формы и добавьте следующие инструкции using (Imports в Visual Basic):

    using System.Data.Services.Client;
    using NorthwindClient.Northwind;
    
  7. В разделяемый класс, определяющий форму, добавьте следующий код, который создает экземпляр объекта 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/";
    
  8. В конструкторе выберите окно.

    Ee373840.note(ru-ru,VS.100).gifПримечание
    Убедитесь, что выбрано само окно, а не содержимое этого окна.Если окно выбрано, текстовое поле Имя в верхней части окна Свойства должно содержать имя окна.

  9. В окне Свойства нажмите кнопку События.

  10. Найдите событие Загружено, затем дважды щелкните раскрывающийся список рядом с этим событием.

    Visual Studio открывает файл с фоновым кодом для окна и формирует обработчик события Loaded.

  11. Скопируйте и вставьте во вновь созданный обработчик события 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());
    }
    
  12. Этот код создает экземпляр DataServiceCollection для типа Customers на основе выполнения запроса LINQ, который возвращает интерфейс IEnumerable объекта Customers вместе со связанными объектами Orders из службы данных Northwind и привязывает его к объекту customersViewSource.

Использование источника данных проекта в форме Windows

  1. Разверните в окне Источники данных узел Customers в источнике данных проекта NorthwindEntities.

  2. Щелкните элемент CustomerID, выберите из списка элемент ComboBox и перетащите элемент CustomerID из узла Customers в конструктор.

    Это приведет к созданию следующих элементов управления в форме:

    • Экземпляр BindingSource с именем customersBindingSource.

    • Экземпляр BindingNavigator с именем customersBindingNavigator. Этот элемент управления можно удалить, так как он не понадобится.

    • Привязанный к данным элемент ComboBox с именем CustomerID.

    • Элемент Label.

  3. Перетащите в форму навигационное свойство Orders.

  4. Это приведет к созданию элемента управления ordersBindingSource и присваиванию свойству DataSource этого элемента управления значения customersBindingSource, а свойству DataMember — значения Customers. Кроме того, в форме будет создан привязанный к данным элемент управления ordersDataGridView в сочетании с элементом управления меткой, имеющим соответствующий заголовок.

  5. Перетащите дополнительные элементы из узла Customers в конструктор. (Необязательно.)

  6. Откройте кодовую страницу формы и добавьте следующие инструкции using (Imports в Visual Basic):

    Imports System.Data.Services.Client
    Imports NorthwindClient.Northwind
    
    using System.Data.Services.Client;
    using NorthwindClient.Northwind;
    
  7. В разделяемый класс, определяющий форму, добавьте следующий код, который создает экземпляр объекта 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/";
    
  8. В конструкторе форм дважды щелкните форму.

    После этого будет открыта страница кода формы и создан метод обработчика события Load для этой формы.

  9. Скопируйте и вставьте в обработчике события 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());
    }
    
  10. Этот код создает экземпляр DataServiceCollection для типа Customers на основе выполнения запроса DataServiceQuery, который возвращает интерфейс IEnumerable объекта Customers из службы данных Northwind и привязывает его к объекту customersBindingSource.

См. также

Задачи

Как привязать данные к элементам Windows Presentation Foundation (службы WCF Data Services)

Другие ресурсы

Клиентская библиотека служб WCF Data Services