Silverlight WCF RIA服务(二十三)Silverlight 客户端 4
DomainDataSource
WCF RIA Services提供DomainDataSource控件來簡(jiǎn)化用戶界面和域上下文中數(shù)據(jù)的交互。通過DomainDataSource,我們可以只是用聲明性語(yǔ)法來檢索、編輯數(shù)據(jù)。我們指定域上下文與DomainDataSource一起使用,然后通過這個(gè)上下文來調(diào)用操作。
配置Silverlight應(yīng)用程序的DomainDataSource
為了使用DomainDataSource控件,我們必須在包含DomainDataSource的SL控件中添加一個(gè)程序集的引用和命名空間。
在SL項(xiàng)目中,我們必須添加一個(gè)對(duì)System.Windows.Controls.Ria程序集的引用。如果選擇DataGrid與DomainDataSource一起使用,我們還要添加對(duì)System.Windows.Controls.Data的引用。
在宿主控件內(nèi),例如UserControl,我們必須添加下面的命名空間引用:
?
| 1 2 3 4 5 | xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Ria" xmlns:riaData="clr-namespace:System.Windows.Data;assembly=System.Windows.Controls.Ria" xmlns:domain="clr-namespace:SilverlightApplication17.Web" |
如果選擇使用DataGrid控件,還需添加下面的命名空間:
?
| 1 2 3 | xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" |
檢索和顯示數(shù)據(jù)
我們?yōu)镈omainDataSource指定一個(gè)域上下文,并向用戶提供方法的名字來裝載數(shù)據(jù)。然后我們綁定表示控件,例如DataGrid對(duì)DomainDataSource。下面的例子演示了DomainDataSource檢索從名為ProductDomainContext的域上下文而來的數(shù)據(jù)。在域服務(wù)中應(yīng)該存在一個(gè)名為GetProduct()的查詢方法。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <USERCONTROL?<br?x:Class="ExampleApplication.MainPage"?/>??? 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:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Ria" ????xmlns:riaData="clr-namespace:System.Windows.Data;assembly=System.Windows.Controls.Ria" ????xmlns:domain="clr-namespace:SilverlightApplication17.Web" ????xmlns:datac="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" ????mc:Ignorable="d"> ????<GRID?x:Name="LayoutRoot"?Background="White"> ????????<RIACONTROLS:DOMAINDATASOURCE?x:Name="source"?AutoLoad="true"QueryName="GetProducts"> ????????????<RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????????????<DOMAIN:PRODUCTDOMAINCONTEXT> ????????????????</DOMAIN:PRODUCTDOMAINCONTEXT> ????????????</RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????</RIACONTROLS:DOMAINDATASOURCE> ????????<DATAC:DATAGRID?ItemsSource="{Binding Data, ElementName=source}"> ????????</DATAC:DATAGRID> ????</GRID> </USERCONTROL> |
對(duì)查詢添加參數(shù)
某些情況下,查詢方法需要參數(shù)值。通常,一個(gè)查詢方法需要一個(gè)參數(shù)值來過濾返回的數(shù)據(jù)。下面的示例演示如何添加參數(shù)值,這個(gè)值可通過聲明性文本來指定。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <GRID x:Name="LayoutRoot"?Background="White"> ????<RIACONTROLS:DOMAINDATASOURCE x:Name="source"?AutoLoad="true"QueryName="GetProductsByColor"> ????????<RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????????<DOMAIN:PRODUCTDOMAINCONTEXT /> ????????</RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????<RIACONTROLS:DOMAINDATASOURCE.QUERYPARAMETERS> ????????????<RIADATA:PARAMETER ParameterName="color"?Value="Black"?/> ????????</RIACONTROLS:DOMAINDATASOURCE.QUERYPARAMETERS> ????</RIACONTROLS:DOMAINDATASOURCE> ????<DATAC:DATAGRID ItemsSource="{Binding Data, ElementName=source}"?/> </GRID> |
還可以使用來自用戶的值來為查詢添加參數(shù)。我們使用ControlParameter對(duì)象來把來自用戶輸入控件的值傳遞到查詢。下面的例子展示了如何指定來自下拉菜單中的值做為參數(shù)值。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <GRID x:Name="LayoutRoot"?Background="White"> ????<GRID.ROWDEFINITIONS> ????????<ROWDEFINITION Height="25"?/> ????????<ROWDEFINITION Height="Auto"?/> ????</GRID.ROWDEFINITIONS>??? ????<RIACONTROLS:DOMAINDATASOURCE x:Name="source"?AutoLoad="true"QueryName="GetProductsByColor"> ????????<RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????????<DOMAIN:PRODUCTDOMAINCONTEXT /> ????????</RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????<RIACONTROLS:DOMAINDATASOURCE.QUERYPARAMETERS> ????????????<RIACONTROLS:CONTROLPARAMETER ????????????????ParameterName="color" ????????????????ControlName="colorCombo" ????????????????PropertyName="SelectedItem.Content" ????????????????RefreshEventName="SelectionChanged"?/> ????????</RIACONTROLS:DOMAINDATASOURCE.QUERYPARAMETERS> ????</RIACONTROLS:DOMAINDATASOURCE> ????<COMBOBOX x:Name="colorCombo"?Grid.Row="0"?Width="60"> ????????<COMBOBOXITEM Content="Black"?/> ????????<COMBOBOXITEM Content="Blue"?/> ????</COMBOBOX> ????<DATAC:DATAGRID Grid.Row="1"?ItemsSource="{Binding Data, ElementName=source}"?/> </GRID> |
排序
DomainDataSource提供SortDescriptors集合來簡(jiǎn)化數(shù)據(jù)的排序。在SortDescriptors集合中,我們提供SortDescriptor實(shí)例來向用戶描述參數(shù)值。我們可以添加多個(gè)SortDescriptor實(shí)例。還可以指定數(shù)據(jù)排序的升降序。下面的示例演示DomainDataSource中的排序描述符,從查詢中檢索的數(shù)據(jù)按來自StandardPrice屬性中的值排序。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <GRID x:Name="LayoutRoot"?Background="White">? ????<RIACONTROLS:DOMAINDATASOURCE x:Name="source"?AutoLoad="true"?QueryName="GetProducts"> ????????<RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????????<DOMAIN:PRODUCTDOMAINCONTEXT /> ????????</RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT>?? ????????<RIACONTROLS:DOMAINDATASOURCE.SORTDESCRIPTORS> ????????????<RIADATA:SORTDESCRIPTOR Direction="Ascending"?PropertyPath="StandardCost"?/> ????????</RIACONTROLS:DOMAINDATASOURCE.SORTDESCRIPTORS> ????</RIACONTROLS:DOMAINDATASOURCE> ????<DATAC:DATAGRID ItemsSource="{Binding Data, ElementName=source}"?/> </GRID> |
分組
DomainDataSource提供了GroupDescriptors集合來通過屬性值來簡(jiǎn)化分組數(shù)據(jù)。在GroupDescriptors集合中,我們提供GroupDescriptor示例來定義用來分組的值。可以添加多個(gè)GroupDescriptors實(shí)例。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <GRID x:Name="LayoutRoot"?Background="White">? ????<RIACONTROLS:DOMAINDATASOURCE x:Name="source"?AutoLoad="true"?QueryName="GetProducts"> ????????<RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????????<DOMAIN:PRODUCTDOMAINCONTEXT /> ????????</RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT>?? ????????<RIACONTROLS:DOMAINDATASOURCE.GROUPDESCRIPTORS> ????????????<RIADATA:GROUPDESCRIPTOR PropertyPath="Size"?/> ????????</RIACONTROLS:DOMAINDATASOURCE.GROUPDESCRIPTORS> ????</RIACONTROLS:DOMAINDATASOURCE> ????<DATAC:DATAGRID ItemsSource="{Binding Data, ElementName=source}"?/> </GRID> |
過濾
DomainDataSource控件提供FilterDescriptors集合來允許我們過濾查詢返回的數(shù)據(jù)。通過添加過濾,我們可以指定只裝載滿足條件的域上下文實(shí)體。在FIlterDescriptorCollection對(duì)象上設(shè)置LogicalOperator屬性,我們可以在不同的過濾之間定義邏輯關(guān)系。
過濾描述符通過FilterOperator枚舉器來支持操作。
當(dāng)定義基于用戶輸入的過濾時(shí),我們可以提供ControlParameter實(shí)例。下面的示例演示了兩個(gè)通過邏輯AND連接的過濾描述符。一個(gè)過濾依賴于用戶的輸入,另一個(gè)過濾通過聲明性語(yǔ)句來指定。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <GRID x:Name="LayoutRoot"?Background="White">? ????<GRID.ROWDEFINITIONS> ????????<ROWDEFINITION Height="25"?/> ????????<ROWDEFINITION Height="Auto"?/> ????</GRID.ROWDEFINITIONS> ????<RIACONTROLS:DOMAINDATASOURCE x:Name="source"?AutoLoad="true"?QueryName="GetProducts"> ????????<RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????????<DOMAIN:PRODUCTDOMAINCONTEXT /> ????????</RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT>?? ????????<RIACONTROLS:DOMAINDATASOURCE.FILTERDESCRIPTORS> ????????????<RIADATA:FILTERDESCRIPTORCOLLECTION LogicalOperator="And"> ??????????????<RIADATA:FILTERDESCRIPTOR Value="Blue"?PropertyPath="Color"Operator="IsEqualTo"?/> ??????????????<RIADATA:FILTERDESCRIPTOR PropertyPath="ListPrice"Operator="IsLessThanOrEqualTo"> ??????????????????<RIACONTROLS:CONTROLPARAMETER ??????????????????????ControlName="MaxPrice" ??????????????????????PropertyName="SelectedItem.Content" ??????????????????????RefreshEventName="SelectionChanged"?/> ??????????????</RIADATA:FILTERDESCRIPTOR> ????????????</RIADATA:FILTERDESCRIPTORCOLLECTION> ????????</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> ????<DATAC:DATAGRID Grid.Row="1"?ItemsSource="{Binding Data, ElementName=source}"?/> </GRID> |
分頁(yè)
當(dāng)顯示大量實(shí)體的時(shí)候,我們會(huì)希望在用戶界面上提供分頁(yè)功能。DomainDataSource控件允許我們指定在一個(gè)頁(yè)面上裝載和顯現(xiàn)的實(shí)體數(shù)量。新紀(jì)錄只有在用戶導(dǎo)航到了還沒有裝載實(shí)體的頁(yè)面時(shí)才裝載。我們?cè)O(shè)置PageSize和LoadSize屬性來指定分頁(yè)的參數(shù)。然后,我們把一個(gè)DataPage實(shí)例綁定到DomainDataSource來實(shí)施分頁(yè)的接口。
注意:如果在應(yīng)用程序中DataPager與實(shí)體框架數(shù)據(jù)存貯一起使用,我們必須對(duì)為DataPager從查詢返回的數(shù)據(jù)進(jìn)行排序。因?yàn)閷?shí)體框架不支持沒有OrderBy子句或在SL客戶端沒指定排序的分頁(yè)。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <GRID x:Name="LayoutRoot"?Background="White">? ????<GRID.ROWDEFINITIONS> ????????<ROWDEFINITION Height="Auto"?/> ????????<ROWDEFINITION Height="Auto"?/> ????</GRID.ROWDEFINITIONS> ????<RIACONTROLS:DOMAINDATASOURCE x:Name="source"?LoadSize="30"?PageSize="15"AutoLoad="true"?QueryName="GetProducts"> ????????<RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????????<DOMAIN:PRODUCTDOMAINCONTEXT /> ????????</RIACONTROLS:DOMAINDATASOURCE.DOMAINCONTEXT> ????????<RIACONTROLS:DOMAINDATASOURCE.SORTDESCRIPTORS> ????????????<RIADATA:SORTDESCRIPTOR PropertyPath="ListPrice"?/> ????????</RIACONTROLS:DOMAINDATASOURCE.SORTDESCRIPTORS> ????</RIACONTROLS:DOMAINDATASOURCE> ????<DATAC:DATAGRID Grid.Row="0"?ItemsSource="{Binding Data, ElementName=source}"?/> ????<DATAC:DATAPAGER Grid.Row="1"?Source="{Binding Data, ElementName=source}"?/> </GRID> |
編輯
進(jìn)行數(shù)據(jù)更改,需要調(diào)用DomainDataSource對(duì)象的SubmitChanges方法。要取消更改,調(diào)用RejectChanges方法。
轉(zhuǎn)載于:https://www.cnblogs.com/Areas/archive/2011/09/09/2172184.html
總結(jié)
以上是生活随笔為你收集整理的Silverlight WCF RIA服务(二十三)Silverlight 客户端 4的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 普洱茶的价格一般在多少
- 下一篇: ffmpeg解码视频存为BMP文件