Как привязать объекты к элементам управления WPF (платформа Entity Framework)

Объект Entity Framework позволяет привязывать такие элементы WPF, как ListBox или ComboBox, к результату EntityCollection или ObjectQuery. Не рекомендуется привязывать элементы управления непосредственно к ObjectQuery. Вместо этого лучше привязывать элементы управления к результату метода Execute. Если вы предпочитаете работать с запросами LINQ, рекомендуем привести результат запроса к ObjectQuery и вызвать метод Execute.

Дополнительные сведения см. в разделе Привязка объектов к элементам управления (платформа Entity Framework).

Пример в этом разделе основан на модели Adventure Works Sales. Чтобы запустить код из данного примера, необходимо сначала добавить к проекту модель AdventureWorks Sales и настроить проект на использование платформы Entity Framework . Для этого выполните инструкции из разделов Как вручную настроить проект Entity Framework и Как определить модель и файлы сопоставления вручную (платформа Entity Framework).

Пример

Следующий пример взят из страницы с выделенным кодом для страницы на языке XAML, которая определяет окно SalesOrders в WPF. При загрузке этого окна происходит возврат экземпляра ObjectResult объекта SalesOrderHeader и связанных объектов SalesOrderDetail путем вызова метода Execute объекта ObjectQuery. Этот результат привязан к свойству DataContext элемента управления Grid.

Imports System
Imports System.Data
Imports System.Data.Objects
Imports System.Windows
Imports System.Linq
Imports Microsoft.Samples.Edm

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)

            ' Instantiate the ObjectContext.
            context = New AdventureWorksEntities()

            ' Define a query that returns orders for a customer.
            ' Because lazy loading is on by default, SalesOrderDetails
            ' related to a SalesOrderHeader will be loaded when the query
            ' is executed.
            Dim query = From o In context.SalesOrderHeaders Where o.CustomerID = customerId

            ' Execute the query and bind the result to the OrderItems control.
            Me.orderItemsGrid.DataContext = CType(query, ObjectQuery).Execute(MergeOption.AppendOnly)
        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 System.Linq;

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)
        {
            // Instantiate the ObjectContext.
            context = new AdventureWorksEntities();

            // Define a query that returns orders for a customer.
            // Because lazy loading is on by default, SalesOrderDetails
            // related to a SalesOrderHeader will be loaded when the query
            // is executed.
            var query = from o in context.SalesOrderHeaders
                         where o.CustomerID == customerId
                         select o;

            // Execute the query and bind the result to the OrderItems control.
            this.orderItemsGrid.DataContext = ((ObjectQuery)query).Execute(MergeOption.AppendOnly);
        }

        private void buttonClose_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        public SalesOrders()
        {
            InitializeComponent();
        }
    }
}

Ниже приведен код на языке XAML, который определяет окно SalesOrders в WPF. Свойство ItemsSource объекта ComboBox привязано к источнику данных ObjectResult<SalesOrderHeader>, который определен на странице с выделенным кодом. При выборе заказа происходит привязка связанных свойств EntityCollection объектов SalesOrderDetail к объекту ListView, который задан свойством ItemsSource. Значение пути Path=SalesOrderDetail в этой привязке обеспечивает то, что происходит привязка объекта ListView к свойству SalesOrderDetail, которое возвращает значение 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=SalesOrderDetails}" 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>

См. также

Задачи

Как привязать объекты к элементам управления Windows Form (платформа Entity Framework)
Как добавить объект в качестве источника данных проекта (платформа Entity Framework)

Основные понятия

Работа с объектами (платформа Entity Framework)
Привязка объектов к элементам управления (платформа Entity Framework)

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

Общие сведения о привязке данных (WPF)