オブジェクトを Windows Presentation Foundation コントロールにバインドする方法 (Entity Framework)
Entity Framework を使用すると、EntityCollection や ObjectQuery の結果に対して、ListBox や ComboBox などの Windows Presentation Foundation (WPF) 要素をバインドできます。 コントロールは ObjectQuery に直接バインドしないことをお勧めします。 代わりに、コントロールを Execute メソッドの結果にバインドします。 LINQ クエリを操作する場合は、クエリの結果を ObjectQuery にキャストし、Execute を呼び出すことをお勧めします。
詳細については、「コントロールへのオブジェクトのバインド (Entity Framework)」を参照してください。
このトピックの例では、Adventure Works Sales Model が使用されています。 この例のコードを実行するには、あらかじめプロジェクトに AdventureWorks Sales Model を追加し、Entity Framework が使用されるようにプロジェクトを構成しておく必要があります。 具体的な方法については、「Entity Framework プロジェクトを手動で構成する方法」および「方法: モデル ファイルとマッピング ファイルを手動で定義する (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 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();
}
}
}
以下に、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=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 フォーム コントロールにバインドする方法 (Entity Framework)
オブジェクトをプロジェクト データ ソースとして追加する方法 (Entity Framework)
概念
オブジェクトの使用 (Entity Framework)
コントロールへのオブジェクトのバインド (Entity Framework)