コントロールへのオブジェクトのバインド (Entity Framework)
Entity Framework を使用すると、ComboBox コントロール、ListView コントロール、DataGridView コントロールなどのコントロールを、EntityCollection または ObjectQuery の実行時に返される ObjectResult にバインドできます。 どちらの Entity Framework クラスも、データ バインド用の IListSource インターフェイスを実装します。 Entity Framework ツールによって生成されるエンティティ型は、INotifyPropertyChanged を実装します。 これにより、オブジェクト プロパティとコントロール間の双方向データ バインドが可能になり、バインドされたオブジェクトのプロパティにコントロールの更新内容が反映されるようになります。
オブジェクトを Windows フォーム コントロールにバインドする場合は、コントロールの DataSource プロパティを EntityCollection に設定するか、Execute メソッドが ObjectQuery オブジェクトで呼び出されるときに返される ObjectResult に設定します。 次の例では、EntityCollection を DataGridView コントロールにバインドします。
// Bind the items for this order to the DataGridView.
lineItemsDataGrid.DataSource = order.SalesOrderDetails;
詳細については、「オブジェクトを Windows フォーム コントロールにバインドする方法 (Entity Framework)」を参照してください。
Visual Studio アプリケーションでオブジェクトに基づくデータ ソースを作成できます。 プロジェクトでエンティティ型をデータ ソースとして定義した後に、[データ ソース] ウィンドウからフォームに項目をドラッグして、Entity Framework のデータが表示されるフォームを作成できます。 これらの項目は、データ ソースにバインドされているフォーム上のコントロールになります。 詳細については、「Data Sources Window」を参照してください。 実行時に、型指定された ObjectQuery の結果を、データ ソースで使用される BindingSource の DataSource プロパティに割り当てます。 これによって、コントロールでクエリから返されたオブジェクトのプロパティが表示されます。 直接的なデータ バインドと同様に、SaveChanges メソッドを呼び出すときにコントロールの値に加えた更新をデータ ソースに適用します。 詳細については、「オブジェクトをプロジェクト データ ソースとして追加する方法 (Entity Framework)」を参照してください。
オブジェクトを Windows Presentation Foundation (WPF) コントロールにバインドする場合は、コントロールの DataContext プロパティを EntityCollection に設定するか、または Execute メソッドが ObjectQuery オブジェクトで呼び出されるときに返される ObjectResult に設定します。 コントロールのオブジェクト ソースを設定するには、ItemsSource プロパティを使用します。 コントロールを、ナビゲーション プロパティから返される関連オブジェクトにバインドしている場合は、ItemsSource プロパティに対して定義されているバインドにパスを含めます。 このパスは、親コントロールの DataContext プロパティで設定されたルート オブジェクトを基準とした相対パスになります。 次の例では、Grid コントロールの DataContext プロパティを設定し、このコントロールを ObjectResult にバインドします。
' Execute the query and bind the result to the OrderItems control.
Me.orderItemsGrid.DataContext = CType(query, ObjectQuery).Execute(MergeOption.AppendOnly)
// Execute the query and bind the result to the OrderItems control.
this.orderItemsGrid.DataContext = ((ObjectQuery)query).Execute(MergeOption.AppendOnly);
次の例は、子である ListView コントロールと ComboBox コントロールの XAML バインド定義を示しています。
<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>
詳細については、「オブジェクトを Windows Presentation Foundation コントロールにバインドする方法 (Entity Framework)」を参照してください。
Entity Framework には、EntityDataSource Web サーバー コントロールが含まれています。 この ASP.NET データ ソース コントロールを使用して、オブジェクト クエリの結果を、ASP.NET Web ページ上のコントロールにバインドできます。 詳細については、「EntityDataSource コントロールの例」を参照してください。
オブジェクトをコントロールにバインドする際は、次の点に注意してください。
コントロールを ObjectQuery に直接バインドしないことをお勧めします。 代わりに、コントロールを Execute メソッドの結果にバインドします。 この方法でバインドすると、バインド中に何度もクエリが実行されることがなくなります。
注 :
LINQ クエリを操作する場合は、クエリの結果を ObjectQuery にキャストし、Execute メソッドを呼び出すことをお勧めします。 次の例では、ComboBox を、型 SalesOrderHeader の ObjectQuery を実行して返される ObjectResult にバインドします。
// Create a query for orders that includes line items. ObjectQuery<SalesOrderHeader> orderQuery = context.SalesOrderHeaders .Where("it.CustomerID = @customerId", new ObjectParameter("customerId", customerId)) .Include("SalesOrderDetails"); // Display the PO number in the combo box. this.ordersListBox.DisplayMember = "PurchaseOrderNumber"; // Bind the combo box to the ObjectResult of SalesOrderHeader // that is returned when the query is executed. this.ordersListBox.DataSource = orderQuery.Execute(MergeOption.AppendOnly);
データ ソースを最新の状態にするために、Execute メソッドを使用してクエリを再実行する必要が生じる場合があります。 これにより、コントロールが新しい ObjectResult にバインドされます。 これを行ってオブジェクト データを最新の状態にするのは次のような場合です。
バインドされたコントロール外の同じ ObjectContext に変更が加えられている場合
データ ソース内のデータに変更が加えられている場合
オブジェクトが NoTracking オプションを使用して返された場合
データ バインドが行われると、個々のエンティティ オブジェクトにコントロールからアクセスできます。 ただし、コレクションにはバインドされたコントロールからアクセスできません。 詳細については、「オブジェクトを Windows フォーム コントロールにバインドする方法 (Entity Framework)」を参照してください。
EntityCollection は IListSource を実装しているので、コントロールにバインドできます。 ただし、EntityCollection で OfType メソッドを実行して派生型のオブジェクトのコレクションを返す場合は、返された IEnumerable をコントロールに直接バインドできません。 コントロールを、EntityCollection から取得した派生型のオブジェクトのコレクションにバインドするには、代わりに CreateSourceQuery メソッドを使用して、基本の EntityCollection を定義する ObjectQuery を取得します。 次の例に示すとおり、ObjectQuery で OfType メソッドから返された ObjectQuery の実行にコントロールをバインドできます。
// Bind the data grid to the result of the execution of the ObjectQuery // that returns only the online courses for the selected department. dataGridViewCourses.DataSource = selectedDepartment.Courses.CreateSourceQuery() .OfType<OnlineCourse>().Execute(MergeOption.AppendOnly);
詳細については、「コントロールを派生型にバインドする方法 (Entity Framework)」を参照してください。
このセクションの内容
オブジェクトを Windows フォーム コントロールにバインドする方法 (Entity Framework)
オブジェクトを Windows Presentation Foundation コントロールにバインドする方法 (Entity Framework)
コントロールを派生型にバインドする方法 (Entity Framework)
オブジェクトをプロジェクト データ ソースとして追加する方法 (Entity Framework)