DomainDataSource

WCF RIA Services에서는 DomainDataSource 컨트롤을 제공하여 사용자 인터페이스와 도메인 컨텍스트 데이터 간의 상호 작용을 단순화합니다. DomainDataSource와 함께 선언적 구문만 사용하여 데이터를 검색, 셰이핑 및 편집할 수 있습니다. DomainDataSource와 함께 사용할 도메인 컨텍스트를 지정한 다음 도메인 컨텍스트를 통해 사용할 수 있는 작업을 호출합니다.

DomainDataSource에 맞게 Silverlight 응용 프로그램 구성

DomainDataSource 컨트롤을 사용하려면 Silverlight 프로젝트에서 System.Windows.Controls.DomainServices 어셈블리에 대한 참조를 추가해야 합니다. 이 참조는 도구 상자에서 DomainDataSource를 끌어오면 자동으로 추가됩니다. 또한 DomainDataSource와 함께 DataGrid를 사용하려면 System.Windows.Controls.Data에 대한 참조를 추가해야 합니다. 이 참조도 도구 상자에서 DataGrid 컨트롤을 끌어오면 자동으로 추가됩니다.

UserControl 등의 호스트 컨트롤은 다음 네임스페이스 참조를 포함해야 합니다.

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

선택적으로 DataGrid 컨트롤을 DomainDataSource와 함께 사용하려면 다음 네임스페이스를 추가해야 합니다.

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

선언적 코드에서 도메인 컨텍스트를 정의하려면 서버 프로젝트의 네임스페이스를 포함해야 합니다. 다음 예제에서 ExampleApplication.Web은 서버 프로젝트의 이름입니다. 실제로는 사용 중인 서버 프로젝트의 이름을 사용합니다.

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

데이터 검색 및 표시

DomainDataSource에 대한 도메인 컨텍스트를 지정하고 데이터를 로드하는 데 사용할 메서드의 이름을 제공합니다. 그런 다음 DataGrid와 같은 프레젠테이션 컨트롤을 DomainDataSource에 바인딩합니다. 다음 예제에서는 ProductDomainContext라는 도메인 컨텍스트에서 데이터를 검색하고 DataGrid 컨트롤에 데이터를 표시하는 DomainDataSource를 보여 줍니다. 예제가 작동하려면 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를 포함합니다. 또는 고유 값을 포함하는 속성을 기준으로 하는 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 컬렉션을 제공합니다. 필터를 추가하면 필터의 조건을 충족하는 엔터티만 도메인 컨텍스트에서 로드되도록 할 수 있습니다. DomainDataSource 개체에 FilterOperator 속성을 설정하여 여러 필터 간의 논리 관계를 정의합니다. FilterOperator 속성은 FilterDescriptorLogicalOperator 열거자의 모든 값을 지원합니다.

FilterDescriptor 인터페이스 내에서 Operator 속성을 설정하여 필터링할 때 사용할 비교 종류를 지정합니다. 필터 설명자는 FilterOperator 열거자의 작업을 지원합니다.

다음 예제에서는 논리 AND 문으로 연결되는 두 개의 필터 설명자를 보여 줍니다. 필터 중 하나는 사용자 입력에 따라 결정되고 다른 하나는 선언 구문에 지정됩니다.

<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 컨트롤을 사용하여 로드할 엔터티 수와 페이지에 표시할 엔터티 수를 지정할 수 있습니다. 사용자가 로드되지 않은 엔터티가 포함된 페이지를 탐색하는 경우에만 새 레코드가 로드됩니다. PageSizeLoadSize 속성을 설정하여 페이징에 사용할 매개 변수를 지정합니다. 그런 다음 DataPager 인스턴스를 DomainDataSource에 바인딩하여 페이징에 사용할 인터페이스를 구현합니다.

[!참고] Entity Framework 데이터 저장소에서 응용 프로그램의 DataPager를 사용할 경우 DataPager가 올바르게 작동하도록 쿼리에서 반환되는 데이터를 정렬해야 합니다. Entity Framework는 Silverlight 클라이언트에 쿼리 메서드 또는 정렬의 OrderBy 절이 지정되지 않은 경우 데이터 페이징을 지원하지 않습니다.

다음 예제에서는 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 메서드를 호출합니다.