通過 DomainDataSource 實現數據的添加、查詢、更新和刪除操作

http://apps.hi.baidu.com/share/detail/30790580

微軟的幫助真是強大啊,大多數的東西拾人牙慧居多,看原版:

http://msdn.microsoft.com/zh-cn/library/ee707363(v=vs.91).aspx

 

客戶端:
DomainDataSourceDemo.xaml

代碼
<!--
    System.Windows.Controls.DomainServices 程序集的默認位置:
    C:\Program Files\Microsoft SDKs\RIA Services\v1.0\Libraries\Silverlight\System.Windows.Controls.DomainServices.dll
-->
<navigation:Page x:Class="Silverlight40.WCFRIAServices.DomainDataSourceDemo" 
           xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
           xmlns:navigation
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           xmlns:sdk
="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
           xmlns:riaControls
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" 
           xmlns:my
="clr-namespace:Silverlight40.Web.Service"
           Title
="DomainDataSourceDemo Page">
    
<Grid x:Name="LayoutRoot">
        
<StackPanel HorizontalAlignment="Left">

            
<!--
                用於演示添加記錄
            
-->
            
<StackPanel Orientation="Horizontal">
                
<sdk:Label Name="lblProductName4Add" Content="產品名稱(添加用):" />
                
<TextBox Name="txtProductName4Add" Width="100" />
                
<Button Name="btnAdd" Content="新增" Click="btnAdd_Click" />
            
</StackPanel>

            
<!--
                用於演示查詢記錄
            
-->
            
<StackPanel Orientation="Horizontal">
                
<sdk:Label Name="lblProductName" Content="產品名稱(查詢用):" />
                
<TextBox Name="txtProductName" Width="100" />
            
</StackPanel>

            
<!--
                用於演示顯示記錄,更新記錄,刪除記錄
                將 DataGrid 的數據源綁定到 DomainDataSource 對象上,相關的查詢排序等邏輯在 DomainDataSource 對象內設置
            
-->
            
<sdk:DataGrid Name="dataGrid" Width="600" Height="300" AutoGenerateColumns="False" ItemsSource="{Binding ElementName=productDomainDataSource, Path=Data}">
                
<sdk:DataGrid.Columns>
                    
<sdk:DataGridTextColumn Header="供應商ID" Binding="{Binding SupplierID}" IsReadOnly="True" />
                    
<sdk:DataGridTextColumn Header="產品類別ID" Binding="{Binding CategoryID}" IsReadOnly="True" />
                    
<sdk:DataGridTextColumn Header="產品ID" Binding="{Binding ProductID}" IsReadOnly="True" />
                    
<sdk:DataGridTextColumn Header="產品名稱" Binding="{Binding ProductName}" />
                    
<sdk:DataGridTemplateColumn Header="刪除">
                        
<sdk:DataGridTemplateColumn.CellTemplate>
                            
<DataTemplate>
                                
<Grid>
                                    
<Button Name="btnDelete" Content="刪除" Click="btnDelete_Click" />
                                
</Grid>
                            
</DataTemplate>
                        
</sdk:DataGridTemplateColumn.CellTemplate>
                    
</sdk:DataGridTemplateColumn>
                
</sdk:DataGrid.Columns>
            
</sdk:DataGrid>
            
            
<!--
                將 DataPager 的數據源綁定到 DomainDataSource 對象上,即可實現服務端分頁
            
-->
            
<sdk:DataPager Name="dataPager" Width="600" Height="30" PageSize="5" Source="{Binding ElementName=productDomainDataSource, Path=Data}" />
            
            
<Button Name="btnSave" Content="保存" Click="btnSave_Click" />
            
        
</StackPanel>

        
<!--
            DomainDataSource - 一種數據源控件,通過一個 Domain 上下文關聯 UI 和 WCF RIA Services。其所有查詢操作均在服務端完成
                QueryName - 指定查詢方法
                AutoLoad - 是否自動加載數據
                FilterOperator - 各個 FilterDescriptor 間的邏輯關係。“And”或“Or”
        
-->
        
<riaControls:DomainDataSource Name="productDomainDataSource" QueryName="GetProductsByCategoryIdQuery" AutoLoad="True" FilterOperator="Or">

            
<!--
                指定數據上下文,來自 Silverlight40.Web.Service.MyDomainContext
            
-->
            
<riaControls:DomainDataSource.DomainContext>
                
<my:MyDomainContext />
            
</riaControls:DomainDataSource.DomainContext>

            
<!--
                指定查詢參數,爲 GetProductsByCategoryId 方法傳遞參數,參數名:categoryId,參數值:1
            
-->
            
<riaControls:DomainDataSource.QueryParameters>
                
<riaControls:Parameter ParameterName="categoryId" Value="1" />
            
</riaControls:DomainDataSource.QueryParameters>

            
<!--
                指定排序邏輯,按 SupplierID 字段正序排序
            
-->
            
<riaControls:DomainDataSource.SortDescriptors>
                
<riaControls:SortDescriptor Direction="Ascending" PropertyPath="SupplierID" />
            
</riaControls:DomainDataSource.SortDescriptors>

            
<!--
                指定分組邏輯,按 SupplierID 字段分組顯示
            
-->
            
<riaControls:DomainDataSource.GroupDescriptors>
                
<riaControls:GroupDescriptor PropertyPath="SupplierID" />
            
</riaControls:DomainDataSource.GroupDescriptors>

            
<!--
                指定過濾邏輯,篩選邏輯爲:ProductName 字段數據包含“a”或者 ProductName 字段數據包含 txtProductName.Text 中的內容
            
-->
            
<riaControls:DomainDataSource.FilterDescriptors>
                
<riaControls:FilterDescriptor Operator="Contains" PropertyPath="ProductName" Value="a" />
                
<riaControls:FilterDescriptor Operator="Contains" PropertyPath="ProductName" Value="{Binding ElementName=txtProductName, Path=Text}" />
            
</riaControls:DomainDataSource.FilterDescriptors>

        
</riaControls:DomainDataSource>
    
</Grid>
</navigation:Page>
在線DEMO
http://www.cnblogs.com/webabcd/archive/2010/08/09/1795417.html

可以參考這個網站

http://www.cnblogs.com/webabcd/archive/2010/10/14/1850959.html

 

====================================

向查詢添加參數

在某些情況下,查詢方法需要參數值。通常,查詢方法需要通過參數值來篩選返回的數據。DomainDataSource 類提供了QueryParameters 集合以便於添加參數。下面的示例演示如何使用聲明性文本中指定的值來添加參數值。

CS
<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 中的值指定爲參數值。

CS
<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 屬性中的值進行排序。

CS
<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 特性分配給包含唯一值(如主鍵)的屬性。或者,將基於包含唯一值的屬性的 OrderBy 子句添加到DomainDataSource 中的查詢。如果僅對不包含唯一值的屬性排序數據,返回值可能包含不一致的數據或缺少跨頁數據。

分組

DomainDataSource 提供了 GroupDescriptors 集合,幫助按照屬性值對數據進行分組。在 GroupDescriptors 集合中,您可以添加GroupDescriptor 實例,此類實例定義用於分組的值。可以根據需要添加多個GroupDescriptor 實例。

RIA_GroupedData

下面的示例演示如何添加用於分組的值。

CS
<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 語句連接。一個篩選器依賴於用戶輸入,另一個篩選器則在聲明性語法中指定。

CS
<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注意:
如果將應用程序中的 DataPager 與實體框架數據存儲區一同使用,則必須對查詢返回的數據進行排序,這樣 DataPager 才能正常工作。實體框架不支持在查詢方法中不存在 OrderBy 子句的情況下對數據分頁,也不支持在 Silverlight 客戶端上指定的排序。

下面的示例演示如何使用 DomainDataSource 進行分頁。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章