Gewusst wie: Binden von Objekten an Windows Presentation Foundation-Steuerelemente (Entity Framework)

Entity Framework ermöglicht Ihnen, Windows Presentation Foundation (WPF)-Elemente, z. B. ein ListBox oder ComboBox an eine EntityCollection-Auflistung oder ein ObjectQuery-Ergebnis zu binden. Es wird empfohlen, Steuerelemente nicht direkt an eine ObjectQuery zu binden. Stattdessen sollten die Steuerelemente an das Ergebnis der Execute-Methode gebunden werden. Wenn Sie es bevorzugen, mit LINQ-Abfragen zu arbeiten, empfiehlt es sich, dass Sie das Ergebnis der Abfrage in ObjectQuery umwandeln und Execute aufrufen.

Weitere Informationen finden Sie unter Binden von Objekten an Steuerelemente (Entity Framework).

Das Beispiel in diesem Thema beruht auf dem Adventure Works Sales-Modell. Um den Code in diesem Beispiel auszuführen, müssen Sie Ihrem Projekt bereits das AdventureWorks Sales-Modell hinzugefügt und das Projekt zur Verwendung von Entity Framework konfiguriert haben. Führen Sie dazu die Verfahren unter Gewusst wie: Manuelles Konfigurieren eines Entity Framework-Projekts und Gewusst wie: Manuelles Definieren der Modell- und Zuordnungsdateien (Entity Framework) durch.

Beispiel

Das folgende Beispiel ist aus der CodeBehind-Seite für eine Extensible Application Markup Language (XAML)-Seite, die das Fenster SalesOrders in WPF definiert. Beim Laden des Fensters werden ein ObjectResult von SalesOrderHeader und verbundene SalesOrderDetail-Objekte durch einen Aufruf der Execute-Methode der ObjectQuery zurückgegeben. Dieses Ergebnis ist an die DataContext-Eigenschaft eines Grid-Steuerelements gebunden.

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();
        }
    }
}

Im folgenden ist ein XAML-Ausschnitt dargestellt, mit dem das Fenster SalesOrders in WPF definiert wird. Die ItemsSource-Eigenschaft eines ComboBox ist an die ObjectResult<SalesOrderHeader>-Datenquelle gebunden, die in der CodeBehind-Seite definiert ist. Wenn eine Bestellung ausgewählt wird, werden die EntityCollection von verbundenen SalesOrderDetail-Objekten an die ListView gebunden, die durch die ItemsSource-Eigenschaft angegeben ist. Mit dem Pfadwert Path=SalesOrderDetail in der Bindung wird sichergestellt, dass ListView an die SalesOrderDetail-Eigenschaft gebunden ist, die eine EntityCollection zurückgibt.

    <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>

Siehe auch

Aufgaben

Gewusst wie: Binden von Objekten an Windows Form-Steuerelemente (Entity Framework)
Gewusst wie: Hinzufügen eines Objekts als Projektdatenquelle (Entity Framework)

Konzepte

Arbeiten mit Objekten (Entity Framework)
Binden von Objekten an Steuerelemente (Entity Framework)

Weitere Ressourcen

Übersicht über die Datenbindung (WPF)