DomainDataSource

WCF RIA サービス には、ユーザー インターフェイスとドメイン コンテキストのデータとの間のやり取りを単純化するための DomainDataSource コントロールが用意されています。DomainDataSource を使用すると、宣言の構文のみを使用してデータを取得、構成、および編集できます。DomainDataSource で使用するドメイン コンテキストを指定してから、そのドメイン コンテキストを介して使用できる操作を呼び出します。

DomainDataSource 向けの Silverlight アプリケーションの構成

DomainDataSource コントロールを使用するには、Silverlight プロジェクトで System.Windows.Controls.DomainServices アセンブリへの参照を追加する必要があります。この参照は、ツールボックスから DomainDataSource をドラッグすると自動的に追加されます。また、DomainDataSourceDataGrid を使用するには、System.Windows.Controls.Data への参照も追加する必要があります。この参照も、ツールボックスから DataGrid コントロールをドラッグすると自動的に追加されます。

UserControl などのホスト コントロールには、次の名前空間の参照を含める必要があります。

xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"

また、DomainDataSource で DataGrid コントロールを使用するには、次の名前空間も追加する必要があります。

xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"

宣言型のコードでドメイン コンテキストを定義するには、サーバー プロジェクトの名前空間を含める必要があります。次の例では、ExampleApplication.Web がサーバー プロジェクトの名前です。使用しているサーバー プロジェクトの名前に置き換えます。

xmlns:domain="clr-namespace:ExampleApplication.Web"

データの取得と表示

DomainDataSource のドメイン コンテキストを指定し、データの読み込みに使用するメソッドの名前を指定します。次に、DataGrid などの表示コントロールを DomainDataSource にバインドします。次の例は、DomainDataSource を示したもので、ProductDomainContext という名前のドメイン コンテキストからデータを取得して DataGrid コントロールにそのデータを表示します。この例が機能するには、ドメイン サービス上に GetProducts() というクエリ メソッドが存在している必要があります。

<UserControl x:Class="ExampleApplication.MainPage"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    xmlns:domain="clr-namespace:ExampleApplication.Web"
    mc:Ignorable="d">

    <Grid x:Name="LayoutRoot" Background="White">
        <riaControls:DomainDataSource Name="source" AutoLoad="True" QueryName="GetProducts">
            <riaControls:DomainDataSource.DomainContext>
                <domain:ProductDomainContext />
            </riaControls:DomainDataSource.DomainContext>
        </riaControls:DomainDataSource>
        <data:DataGrid ItemsSource="{Binding Data, ElementName=source}"  />
    </Grid>
</UserControl>

クエリへのパラメーターの追加

場合によって、クエリ メソッドにはパラメーター値が必要です。通常、クエリ メソッドには、返されるデータをフィルター処理するためのパラメーター値が必要です。DomainDataSource クラスは、パラメーターの追加を容易にする QueryParameters コレクションを提供します。次の例は、宣言テキストで指定された値を持つパラメーター値を追加する方法を示したものです。

<Grid x:Name="LayoutRoot" Background="White">
    <riaControls:DomainDataSource Name="source" QueryName="GetProductsByColor" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.QueryParameters>
            <riaControls:Parameter ParameterName="color" Value="Black" />
        </riaControls:DomainDataSource.QueryParameters>
    </riaControls:DomainDataSource>
    <data:DataGrid ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

ユーザー入力値をクエリに使用するパラメーターを追加することもできます。クエリで使用する値を含むユーザー入力コントロールに Parameter オブジェクトをバインドします。次の例は、ComboBox から取得した値をパラメーター値として指定する方法を示したものです。

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="25" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <riaControls:DomainDataSource Name="source" QueryName="GetProductsByColor" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.QueryParameters>
            <riaControls:Parameter ParameterName="color" Value="{Binding ElementName=colorCombo, Path=SelectedItem.Content}" />
        </riaControls:DomainDataSource.QueryParameters>
    </riaControls:DomainDataSource>
    <ComboBox Width="60"  Grid.Row="0" x:Name="colorCombo">
        <ComboBoxItem Content="Black" />
        <ComboBoxItem Content="Blue" />
    </ComboBox>
    <data:DataGrid Grid.Row="1" ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

並べ替え

DomainDataSource は、データの並べ替えを容易にする SortDescriptors コレクションを提供します。SortDescriptors コレクションで、コレクションの並べ替えに使用する値を記述する SortDescriptor インスタンスを追加します。並べ替えのレイヤーを提供するため、必要な数だけ SortDescriptor インスタンスを追加できます。データを昇順または降順のどちらで並べ替えるかを指定できます。次の例は、DomainDataSource に並べ替え記述子を追加する方法を示したものです。クエリから取得されたデータは、StandardPrice プロパティの値で並べ替えられます。

<Grid x:Name="LayoutRoot" Background="White">
    <riaControls:DomainDataSource Name="source" QueryName="GetProducts" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.SortDescriptors>
            <riaControls:SortDescriptor PropertyPath="StandardCost" Direction="Ascending" />
            <riaControls:SortDescriptor PropertyPath="ProductID" Direction="Ascending" />
        </riaControls:DomainDataSource.SortDescriptors>
    </riaControls:DomainDataSource>
    <data:DataGrid ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

ページングと並べ替えを同時に実装する場合は、プライマリ キーのような一意の値を含むプロパティに PropertyPath 属性が割り当てられた SortDescriptor を少なくとも 1 つ含めます。または、一意の値を含むプロパティに基づいて OrderBy 句を DomainDataSource のクエリに追加します。一意の値を含まないプロパティのデータを並べ替えるのみの場合、ページ間でのデータの不整合や欠落が戻り値に生じる可能性があります。

グループ化

DomainDataSource は、プロパティ値に基づくデータのグループ化を容易にする GroupDescriptors コレクションを提供します。GroupDescriptors コレクションで、グループ化に使用する値を定義する GroupDescriptor インスタンスを追加します。必要な数だけ GroupDescriptor インスタンスを追加できます。

RIA_GroupedData

次の例は、グループ化に使用される値を追加する方法を示したものです。

<Grid x:Name="LayoutRoot" Background="White">
    <riaControls:DomainDataSource Name="source" QueryName="GetProducts" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.GroupDescriptors>
            <riaControls:GroupDescriptor PropertyPath="Size" />
        </riaControls:DomainDataSource.GroupDescriptors>
    </riaControls:DomainDataSource>
    <data:DataGrid ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

フィルター処理

DomainDataSource コントロールは、クエリによって返されたデータをフィルター処理するための FilterDescriptors コレクションを提供します。フィルターを追加すると、フィルターの条件を満たすエンティティのみがドメイン コンテキストから読み込まれるように指定できます。FilterOperator プロパティを DomainDataSource オブジェクトに設定して、さまざまなフィルター間の論理的な関係を定義します。FilterOperator プロパティは、FilterDescriptorLogicalOperator 列挙子の任意の値をサポートします。

FilterDescriptor インスタンス内で、Operator プロパティを設定して、フィルター処理時に使用する比較の種類を指定します。フィルター記述子は FilterOperator 列挙子の操作をサポートします。

次の例は、論理 AND ステートメントによって接続される 2 つのフィルター記述子を示したものです。一方のフィルターはユーザー入力に依存し、他方のフィルターは宣言構文で指定されます。

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="25" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <riaControls:DomainDataSource Name="source" FilterOperator="And" QueryName="GetProducts" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.FilterDescriptors>
            <riaControls:FilterDescriptor PropertyPath="Color" Operator="IsEqualTo" Value="Blue" />
            <riaControls:FilterDescriptor PropertyPath="ListPrice" Operator="IsLessThanOrEqualTo" Value="{Binding ElementName=MaxPrice, Path=SelectedItem.Content}" />
        </riaControls:DomainDataSource.FilterDescriptors>
    </riaControls:DomainDataSource>
    <ComboBox x:Name="MaxPrice" Grid.Row="0" Width="60" SelectedIndex="0">
        <ComboBoxItem Content="100" />
        <ComboBoxItem Content="500" />
        <ComboBoxItem Content="1000" />
    </ComboBox>
    <data:DataGrid Grid.Row="1" ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

ページング

多数のエンティティを表示する場合、ユーザー インターフェイスにページングを指定できます。DomainDataSource コントロールを使用すると、読み込むエンティティの数とページに表示するエンティティの数を指定できます。新しいレコードが読み込まれるのは、まだ読み込まれていないエンティティを含むページにユーザーが移動したときのみです。PageSize プロパティと LoadSize プロパティを設定して、ページングのパラメーターを指定します。次に、DataPager インスタンスを DomainDataSource にバインドしてページングのためのインターフェイスを実装します。

note注 :
Entity Framework データ ストアでアプリケーションの DataPager を使用する場合、DataPager が正しく動作するようにクエリによって返されるデータを並べ替える必要があります。Entity Framework では、クエリ メソッドに OrderBy 句が含まれていないデータのページングも、Silverlight クライアントで指定された並べ替えもサポートされていません。

次の例は、DomainDataSource を使用したページングを示したものです。

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <riaControls:DomainDataSource PageSize="15" LoadSize="30" Name="source" QueryName="GetProducts" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.SortDescriptors>
            <riaControls:SortDescriptor PropertyPath="ListPrice" />
        </riaControls:DomainDataSource.SortDescriptors>
    </riaControls:DomainDataSource>
    <data:DataGrid Grid.Row="0" ItemsSource="{Binding Data, ElementName=source}" />
    <data:DataPager Grid.Row="1" Source="{Binding Data, ElementName=source}" />
</Grid>

編集

データの変更を保持するには、DomainDataSource オブジェクトで SubmitChanges メソッドを呼び出します。変更を取り消すには、RejectChanges メソッドを呼び出します。