HRApp 项目是.NET RIA Services MSDN 上的案例,一个使用Silverlight 3.0 + .Net RIA Service 构建的完整商业应用程序,
学习英文版的开发手册总是比较费力的,所以顺带着简略翻译一下,也有部分自己心得体会,不足之处还望大家多多交流。
1 安装
1. 卸载以前的版本
a. Microsoft Silverlight (任何Silverlight 3 RTW之前的版本)
b. Microsoft Silverlight SDK
c. Microsoft Silverlight Tools for Visual Studio 2008
2. 安装.NET Framework 3.5 SP1 和Visual Studio 2008 SP1 (带 SQL Express),参考:
http://msdn.microsoft.com/en-us/vstudio/cc533448.aspx.
3. 顺序安装以下最新版本软件:
a. Silverlight 3
b. Silverlight 3 SDK
c. Silverlight 3 Tools for Visual Studio 2008 SP1
4. .NET RIA Services July Preview
2 创建工程
选择创建Silverlight Business Application ,会自动添加所需.net RIA引用,并生成一个Silverlight项目和一个web项目。其中的web项目已经集成了登录和注册功能模块。按F5运行查看演示。默认的注册功能需要确保本机已经安装SQLSERVER 2005 EXPRESS ,第一次运行会提示更改配置文件以启用客户端调试。
2.1 创建界面
1. 打开客户端工程中的MainTest.xaml文件,找到下面的代码
<TextBlock x:Name="ApplicationNameTextBlock" Style="{StaticResource ApplicationNameStyle}" Text="Application Name"/>
替换为
<TextBlock x:Name="ApplicationNameTextBlock" Style="{StaticResource ApplicationNameStyle}" Text="HR Application"/>
2. 选择HRApp项目,右击添加 New File.
3. 弹出对话框,选择Page ,命名为EmployeeList.
4. 打开 EmployeeList.xaml 在<Grid>标记下添加下面的代码。
Code
<ScrollViewer BorderThickness="0" VerticalScrollBarVisibility="Auto" Padding="12,0,12,0" Margin="-12">
<StackPanel Margin="0,12,0,12" Orientation="Vertical" >
<TextBlock Text="Employee List" Style="{StaticResource HeaderTextStyle}"/>
</StackPanel>
</ScrollViewer>
5. 在项目面板中将EmployeeList.xaml拖动到 Views 文件夹中.
6. 打开MainPage.xaml 找到Home 链接按钮并在旁边再添加如下按钮<!-- XAML -->
Code
<HyperlinkButton x:Name="Link3" Style="{StaticResource LinkStyle}" NavigateUri="/EmployeeList" TargetName="ContentFrame" Content="employee list"/>
<Rectangle x:Name="Divider2" Style="{StaticResource DividerStyle}"/>
7. 运行后如下图
3 添加业务逻辑到 .NET RIA Services 工程
3.1 添加数据源
1. 将AdventureWorks_Data.mdf和AdventureWorks_Log.ldf添加到App_Data目录下
2. 在web工程上右击添加新项ADO.NET Entity Data Model
3. 命名为 AdventureWorks.edmx。
4. 在实体模型向导中, 选择generate the Model 后Next.
5. 选择 AdventureWorks 数据库 并设置实体集名称为 AdventureWorks_DataEntities.
6. 为了简单起见,这里我们从所有表中选择Employee表作为实体模型. 设置命名空间为AdventureWorks_DataModel ,完成。
7. 随后我们编译一下整个项目。
3.2 添加Domain Service Object and Query for Data
1. 在web工程上右击添加新建项(New Item)
2. 选择Web分类下, Domain Service Class,命名为OrganizationService。
3. 在弹出的对话框中选择实体集中的Employee 表, 选中 Enable editing,Generate associated classes for metadata,Enable Client Access 三个CheckBox。
4. 从刚建的服务类中,我们可以看到,因为选中了Enabled Edit,所以VS为我们加入了增,删,改等功能接口。
5. 为了程序演示效果,我们让GetEmployee()返回已排序的对象列表。
将下面代码:
//
C#
public
IQueryable
<
Employee
>
GetEmployee()
{
return
this
.Context.Employee;
}
替换为
//
C#
public
IQueryable
<
Employee
>
GetEmployee()
{
return
this
.Context.Employee.OrderBy(e
=>
e.EmployeeID);
}
6. 按F6, 我们编译一下整个项目。(因为只有在每次编译时,.net Service 才会将DomainContext和所有实体对象类自动生成到客户端工程中)
7. 打开 EmployeeList.xaml. 从工具箱拖动一个DataGrid控件 到xaml. 并放在TextBlock下方。并向客户端工程中手动添加System.Windows.Controls.Data
引用,在xaml中添加
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
如果是在Blend 中则可以直接拖动,不用麻烦了。构建成如下这样一个DataGrid。
<
data:DataGrid
x:Name
="dataGrid1"
MinHeight
="100"
IsReadOnly
="True"
></
data:DataGrid
>
8. 打开EmployeeList.xaml.cs后台代码,加入下面的命名空间引用。
//
C#
using
HRApp.Web;
using
System.Windows.Ria.Data;
9. 当客户端自动生成服务类代码后,可以看到OrganizationContext 已经可以被智能识别了。那么怎样载入服务器端的数据呢并绑定到DataGrid呢?只需简单的几行代码。
Code
namespace HRApp
{
public partial class EmployeeList : Page
{
OrganizationContext _OrganizationContext = new OrganizationContext();
public EmployeeList()
{
InitializeComponent();
this.dataGrid1.ItemsSource = _OrganizationContext.Employees;
_OrganizationContext.Load(_OrganizationContext.GetEmployeeQuery());
}
// Occurs when the user navigates to this page.
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
}
}
10. 按F5 运行程序,点击EmployeeList 按钮,可以看到DataGrid和加载的数据.
3.2.1 使用DomainDataSource控件
1. 在ASP.net中我们看到过LinqDataSource,在这里我们将添加一个新的控件DomainDataSource,其原理大致是一样的。
2. 首先在客户端工程中需要添加程序集引用,System.Windows.Ria.Controls.dll
3. 如果使用VS2005请如果没有请手动导入,在系统目录 ‘%ProgramFiles%\Microsoft SDKs\RIA Services\v1.0\Libraries\Silverlight’ 下 .
4. 如果使用Blend 3.0开发,只需要拖动,在VS2008中要手动写界面代码。
5. 在XAML文件中添加程序集引用
<!-- XAML -->
xmlns:ds="clr-namespace:HRApp.Web"
xmlns: riaControls ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Ria.Controls"
6. 命名DomainDataSource 为employeeDataSource’ 并作如下设置
Code
<riaControls:DomainDataSource x:Name="employeeDataSource" LoadSize="20" QueryName="GetSalariedEmployee" AutoLoad="True" >
<riaControls:DomainDataSource.DomainContext>
<ds:OrganizationContext/>
</riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>
7. 同时修改 DataGrid 代码:
<
data:DataGrid
Height
="Auto"
MinHeight
="100"
IsReadOnly
="True"
ItemsSource
="
{Binding Data, ElementName=employeeDataSource}
"
x:Name
="dataGrid1"
/>
8. 代开 EmployeeList.xaml.cs ,将代码如下全部注释。和LinqDataSource是不是很像?哈哈
Code
//OrganizationContext _OrganizationContext = new OrganizationContext();
public EmployeeList()
{
InitializeComponent();
//this.dataGrid1.ItemsSource = _OrganizationContext.Employees;
//_OrganizationContext.Load(_OrganizationContext.GetEmployeeQuery());
}
9. 可以运行程序了,看看数据是否显示?It’s Great e, No Code!
3.2.2 给数据源添加排序,过滤,分页功能
1. 向EmployeeList.xaml:中添加引用
xmlns:riaData="clr-namespace:System.Windows.Data;assembly=System.Windows.Ria.Controls"
2. SortDescriptors 是 DomainDataSource提供的专门用于排序的接口属性. 可以提供针对某个属性列上的排序,PropertyPath是对应的对象属性。
Code
<riaControls:DomainDataSource x:Name="employeeDataSource" LoadSize="20" QueryName="GetEmployee" AutoLoad="True" >
<riaControls:DomainDataSource.DomainContext>
<ds:OrganizationContext/>
</riaControls:DomainDataSource.DomainContext>
<riaControls:DomainDataSource.SortDescriptors>
<riaData:SortDescriptor PropertyPath="VacationHours" Direction="Ascending" />
</riaControls:DomainDataSource.SortDescriptors>
</riaControls:DomainDataSource>
3. 运行程序即可看到EmployeeList按VacationHours 升序.
4. 下面看怎样使用过滤器.
Code
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,-16,0,0">
<TextBlock VerticalAlignment="Center" Text="Min Vacation Hours Filter" />
<TextBox x:Name="vacationHoursText" Width="75" FontSize="11" Margin="4" Text="0"/>
</StackPanel>
<riaControls:DomainDataSource x:Name="employeeDataSource" LoadSize="20" QueryName="GetEmployeeQuery" AutoLoad="True" >
<riaControls:DomainDataSource.DomainContext>
<ds:OrganizationContext/>
</riaControls:DomainDataSource.DomainContext>
<!--排序器-->
<riaControls:DomainDataSource.SortDescriptors>
<riaData:SortDescriptor PropertyPath="VacationHours" Direction="Ascending" />
</riaControls:DomainDataSource.SortDescriptors>
<!--过滤器-->
<riaControls:DomainDataSource.FilterDescriptors>
<riaData:FilterDescriptorCollection>
<riaData:FilterDescriptor PropertyPath="VacationHours" Operator="IsGreaterThanOrEqualTo">
<riaData:ControlParameter ControlName="vacationHoursText" PropertyName="Text" RefreshEventName="TextChanged" />
</riaData:FilterDescriptor>
</riaData:FilterDescriptorCollection>
</riaControls:DomainDataSource.FilterDescriptors>
</riaControls:DomainDataSource>
<!--DataGrid-->
<data:DataGrid Height="Auto" MinHeight="100" IsReadOnly="True" ItemsSource="{Binding Data, ElementName=employeeDataSource}" x:Name="dataGrid1" />
这里蓝色部分为过滤器提供了一个参数,这个参数值被绑定到一个TextBox控件的Text属性值。
Operator为一个FilterOperator枚举类型.RefreshEventName是使用Filter更新后的回调函数,这里我们让文本框在按下回车后就自动更新。
5. 运行程序,在“Min Vacation Hours Filter”旁的 TextBox中填入最小值,按回车。
6. 下面我们给DataGrid 增加分页功能,从工具箱拖动一个 DataPager 控件到EmployeeList.xaml.放在DataGrid的下面,
<
data:DataPager
PageSize
="5"
Source
="
{Binding Data, ElementName=employeeDataSource}
"
Margin
="0,-1,0,0"
></
data:DataPager
>
PageSize为页面大小,这里显示5行,并绑定数据。
7. 运行程序点击 employee list 链接. 嘿嘿,效果不错。
时间有限,今天就到译这里,下一篇将加入数据绑定及绑定验证。