次の方法で共有


オブジェクトを Windows Presentation Foundation コントロールにバインドする方法 (Entity Framework)

Object Services を使用すると、EntityCollectionObjectQuery の結果に対して、ListBoxComboBox などの Windows Presentation Foundation (WPF) 要素をバインドできます。コントロールは ObjectQuery に直接バインドしないことをお勧めします。代わりに、コントロールを Execute メソッドの結果にバインドします。詳細については、「コントロールへのオブジェクトのバインド (Entity Framework)」を参照してください。

このトピックの例には、Adventure Works Sales Model が使用されています。この例のコードを実行するには、あらかじめプロジェクトに AdventureWorks Sales Model を追加し、エンティティ フレームワーク が使用されるようにプロジェクトを構成しておく必要があります。具体的な方法については、「Entity Framework プロジェクトを手動で構成する方法」および「Entity Data Model を手動で定義する方法 (Entity Framework)」の手順を参照してください。

次の例は、WPF で SalesOrders ウィンドウを定義する Extensible Application Markup Language (XAML) の分離コード ページからの抜粋です。ウィンドウの読み込み時に、ObjectQueryExecute メソッドを呼び出して、SalesOrderHeader および関連の SalesOrderDetail オブジェクトの ObjectResult が返されます。この結果は、Grid コントロールの DataContext プロパティにバインドされます。

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

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)
            Try
                ' Instantiate the ObjectContext.
                context = New AdventureWorksEntities()

                ' Define a query that returns orders for a customer.
                Dim query As ObjectQuery(Of SalesOrderHeader) = context.SalesOrderHeader _
                    .Where("it.customerID = @customerid", _
                    New ObjectParameter("customerid", customerId)) '_
                '.Include("SalesOrderDetail")

                ' Execute the query and bind the result to the OrderItems control.
                Me.orderItemsGrid.DataContext = query.Execute(MergeOption.AppendOnly)
            Catch ex As EntitySqlException
                MessageBox.Show(ex.Message)
            End Try
        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 AdventureWorksModel;

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

                // Define a query that returns orders for a customer.
                ObjectQuery<SalesOrderHeader> query = context.SalesOrderHeader
                    .Where("it.customerID = @customerid",
                    new ObjectParameter("customerid", customerId))
                    .Include("SalesOrderDetail");
                
                // Execute the query and bind the result to the OrderItems control.
                this.orderItemsGrid.DataContext = query.Execute(MergeOption.AppendOnly);
            }
            catch (EntitySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

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

以下に、WPF で SalesOrders ウィンドウを定義する XAML を示します。ComboBoxItemsSource プロパティは、分離コード ページで定義される ObjectResult<SalesOrderHeader> データ ソースにバインドされます。注文が選択されると、SalesOrderDetail オブジェクトの関連する EntityCollectionItemsSource プロパティで指定された ListView にバインドされます。バインド内の Path=SalesOrderDetail のパス値によって、ListViewEntityCollection を返す SalesOrderDetail プロパティにバインドされます。

    <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=SalesOrderDetail}" 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 フォーム コントロールにバインドする方法 (Entity Framework)
オブジェクトをプロジェクト データ ソースとして追加する方法 (Entity Framework)

概念

コントロールへのエンティティ データのバインド (アプリケーション シナリオ)
コントロールへのオブジェクトのバインド (Entity Framework)
コントロールへのエンティティ データのバインド (アプリケーション シナリオ)

その他のリソース

オブジェクトの使用 (Entity Framework タスク)
データ バインドの概要 (WPF)