オブジェクトを Windows Presentation Foundation コントロールにバインドする方法 (Entity Framework)
Object Services を使用すると、EntityCollection や ObjectQuery の結果に対して、ListBox や ComboBox などの 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) の分離コード ページからの抜粋です。ウィンドウの読み込み時に、ObjectQuery の Execute メソッドを呼び出して、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 を示します。ComboBox の ItemsSource プロパティは、分離コード ページで定義される ObjectResult<SalesOrderHeader> データ ソースにバインドされます。注文が選択されると、SalesOrderDetail オブジェクトの関連する EntityCollection が ItemsSource プロパティで指定された ListView にバインドされます。バインド内の Path=SalesOrderDetail
のパス値によって、ListView は EntityCollection を返す 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)
コントロールへのエンティティ データのバインド (アプリケーション シナリオ)