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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值