コントロールへのオブジェクトのバインド (Entity Framework)

Object Services を使用すると、ComboBox コントロール、ListView コントロール、DataGridView コントロールなどのコントロールを、EntityCollection または ObjectQuery の実行時に返される ObjectResult にバインドできます。どちらの エンティティ フレームワーク クラスも、データ バインド用の IListSource インターフェイスを実装します。すべてのエンティティ オブジェクトは StructuralObject 基本クラスから派生し、INotifyPropertyChanged が実装されます。これにより、オブジェクト プロパティとコントロール間の双方向データ バインドが可能になり、バインドされたオブジェクトのプロパティにコントロールの更新内容が反映されるようになります。

オブジェクトを Windows フォーム コントロールにバインドする場合は、コントロールの DataSource プロパティを EntityCollection に設定するか、Execute メソッドが ObjectQuery オブジェクトで呼び出されるときに返される ObjectResult に設定します。次の例では、EntityCollectionDataGridView コントロールにバインドします。

' Bind the items for this order to the DataGridView.
lineItemsDataGrid.DataSource = order.SalesOrderDetail
// Bind the items for this order to the DataGridView.
lineItemsDataGrid.DataSource = order.SalesOrderDetail;

詳細については、「オブジェクトを Windows フォーム コントロールにバインドする方法 (Entity Framework)」を参照してください。

Visual Studio アプリケーションでオブジェクトに基づくデータ ソースを作成できます。プロジェクトでエンティティ型をデータ ソースとして定義した後に、[データ ソース] ウィンドウからフォームに項目をドラッグして、Entity Data Model (EDM) のデータが表示されるフォームを作成できます。これらの項目は、データ ソースにバインドされているフォーム上のコントロールになります。詳細については、「[データ ソース] ウィンドウ」を参照してください。実行時に、型指定された ObjectQuery の結果を、データ ソースで使用される BindingSourceDataSource プロパティに割り当てます。これによって、コントロールでクエリから返されたオブジェクトのプロパティが表示されます。直接的なデータ バインドと同様に、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 = query.Execute(MergeOption.AppendOnly)
// Execute the query and bind the result to the OrderItems control.
this.orderItemsGrid.DataContext = 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=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>

詳細については、「オブジェクトを Windows Presentation Foundation コントロールにバインドする方法 (Entity Framework)」を参照してください。

エンティティ フレームワーク には、EntityDataSource Web サーバー コントロールが含まれています。この ASP.NET データ ソース コントロールを使用して、オブジェクト クエリの結果を、ASP.NET Web ページ上のコントロールにバインドできます。詳細については、「EntityDataSource コントロールの例」を参照してください。

オブジェクトをコントロールにバインドする際は、次の点に注意してください。

  • コントロールを ObjectQuery に直接バインドしないことをお勧めします。代わりに、コントロールを Execute メソッドの結果にバインドします。この方法でバインドすると、バインド中に何度もクエリが実行されることがなくなります。

    次の例では、ComboBox を、型 SalesOrderHeaderObjectQuery を実行して返される ObjectResult にバインドします。

    ' Create a query for orders that includes line items.
    Dim orderQuery As ObjectQuery(Of SalesOrderHeader) = _
    context.SalesOrderHeader _
            .Where("it.CustomerID = @customerId", _
            New ObjectParameter("customerId", customerId)) _
    .Include("SalesOrderDetail")
    
    ' Bind the combo box to the ObjectResult of SalesOrderHeader 
    ' that is returned when the query is executed.
    Me.ordersListBox.DataSource = orderQuery.Execute(MergeOption.AppendOnly)
    
    // Create a query for orders that includes line items.
    ObjectQuery<SalesOrderHeader> orderQuery = context.SalesOrderHeader
        .Where("it.CustomerID = @customerId", 
        new ObjectParameter("customerId", customerId))
        .Include("SalesOrderDetail");
    
    // 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)」を参照してください。

  • EntityCollectionIListSource を実装しているので、コントロールにバインドできます。ただし、EntityCollectionOfType メソッドを実行して派生型のオブジェクトのコレクションを返す場合は、返された IEnumerable をコントロールに直接バインドできません。コントロールを、EntityCollection から取得した派生型のオブジェクトのコレクションにバインドするには、代わりに CreateSourceQuery メソッドを使用して、基本の EntityCollection を定義する ObjectQuery を取得します。ObjectQueryOfType メソッドから返された ObjectQuery の実行にコントロールをバインドできます。

参照

概念

投影および制限メソッド (LINQ to Entities)

その他のリソース

オブジェクトの使用 (Entity Framework)
チュートリアル : Course Manager Web アプリケーションの作成