共用方式為


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"

另外,若要搭配 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>

當您同時實作分頁和排序時,請至少加入一個 SortDescriptor 並將其 PropertyPath 屬性 (Attribute) 指派至包含唯一值的屬性 (Property),例如主索引鍵。或者,請根據包含唯一值的屬性,將 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,以實作分頁的介面。

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 方法。