大佬教程收集整理的这篇文章主要介绍了稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data Services 进行通信,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
http://tech.cncms.com/web/aspnet/3266.html
介绍
Silverlight 4.0 对 WCF Data services 的支持:
* DataserviceCollection<T> - 继承自 ObservableCollection<T>,用于将 WCF Data services 提供的数据绑定到 Silverlight 控件上,当数据发生变化时可提供通知
在线DEMO
http://www.cnblogs.com/webabcd/archive/2010/08/09/1795417.html
示例
演示 Silverlight 4.0 与 WCF Data services 之间的通信
1、服务端
MyWCFDataservice.svc.cs
/*
* WCF Data services - 用于提供基于 OData 协议的数据服务
* OData 协议 - 开放数据协议(Open Data Protocol),其基于 REST-ful 协议,参考:http://www.odata.org/
*/
using System;
using System.Collections.Generic;
using System.Data.services;
using System.Data.services.Common;
using System.Linq;
using System.serviceModel.Web;
using System.Web;
namespace Silverlight40.Web.service
{
public class MyWCFDataservice : Dataservice<Model.NorthwindEntities>
{
public static void Initializeservice(DataserviceConfiguration config)
{
config.SetEntitySetAccessRule("*",EntitySetrights.All);
// 指定对 Products,Categories,orders 启用服务端分页,页大小为 3
config.SetEntitySetPageSize("Products",3);
config.SetEntitySetPageSize("Categories",3);
config.SetEntitySetPageSize("orders",3);
config.DataserviceBehavior.MaxProtocolVersion = DataserviceProtocolVersion.V2;
}
}
}
2、客户端
Demo.xaml
<navigation:Page x:Class="Silverlight40.WCFDataservices.Demo"
xmlns="http://scheR_818_11845@as.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://scheR_818_11845@as.microsoft.com/winfx/2006/xaml"
xmlns:d="http://scheR_818_11845@as.microsoft.com/expression/blend/2008"
xmlns:mc="http://scheR_818_11845@as.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:sdk="http://scheR_818_11845@as.microsoft.com/winfx/2006/xaml/presentation/sdk"
title="Demo Page">
<Grid x:Name="LayoutRoot">
<StackPanel Orientation="Vertical" HorizontalAlignment="Left">
<!--
用于演示通过 WCF Data services 实现数据的增删改查
-->
<StackPanel Orientation="Horizontal">
<Button Name="btnGetData" Content="获取数据" Margin="5" Click="btnGetData_Click" />
</StackPanel>
<TextBlock Text="产品类别列表:" Margin="5" />
<sdk:DataGrid Name="gridCategory" Margin="5" Height="200" Width="400" AutoGeneratecolumns="false" Itemssource="{Binding}"
SELEctionChanged="gridCategory_SELEctionChanged">
<sdk:DataGrid.columns>
<sdk:DataGridTextcolumn Header="类别ID" Binding="{Binding CategoryID}" IsReadOnly="True" />
<sdk:DataGridTextcolumn Header="类别名称" Binding="{Binding CategoryNamE}" />
</sdk:DataGrid.columns>
</sdk:DataGrid>
<TextBlock Text="产品列表:" Margin="5" />
<sdk:DataGrid Name="gridProduct" Margin="5" Height="200" Width="400" AutoGeneratecolumns="false" Itemssource="{Binding}" >
<sdk:DataGrid.columns>
<sdk:DataGridTextcolumn Header="产品ID" Binding="{Binding ProductID}" IsReadOnly="True" />
<sdk:DataGridTextcolumn Header="产品名称" Binding="{Binding ProductNamE}" />
<sdk:DataGridTextcolumn Header="单价" Binding="{Binding UnitPricE}" IsReadOnly="True" />
</sdk:DataGrid.columns>
</sdk:DataGrid>
<Button Name="btnSave" Content="保存" Margin="5" Width="400" Click="btnSave_Click" />
<!--
用于演示 WCF Data services 的服务端分页
-->
<TextBlock Text="订单列表:" Margin="5,20,5,5" />
<sdk:DataGrid Name="gridOrder" Margin="5" Height="200" Width="400" IsReadOnly="True" AutoGeneratecolumns="false" Itemssource="{Binding}" >
<sdk:DataGrid.columns>
<sdk:DataGridTextcolumn Header="订单ID" Binding="{Binding OrderID}" />
<sdk:DataGridTextcolumn Header="客户ID" Binding="{Binding CustomerID}" />
</sdk:DataGrid.columns>
</sdk:DataGrid>
<TextBlock Name="txtCurrentPageIndex" />
<Button Name="btnPrev" Content="上一页" Margin="5" Width="400" />
<Button Name="btnNext" Content="下一页" Margin="5" Width="400" />
</StackPanel>
</Grid>
</navigation:Page>
Demo.xaml.cs
/*
* 演示 Silverlight 4.0 与 WCF Data services 之间的通信
*
* DataserviceCollection<T> - 继承自 ObservableCollection<T>。用于将 WCF Data services 提供的数据绑定到 Silverlight 控件上,当数据发生变化时可提供通知
* LoadAsync(IQueryable<T>) - 从数据服务上异步加载 IQueryable<T> 数据到 DataserviceCollection<T> 中(在 LoadCompleted 触发之前不能再调用此方法)
* LoadAsync() - 当 DataserviceCollection<T> 表示为某实体的导航属性时,从数据服务上异步加载该数据(在 LoadCompleted 触发之前不能再调用此方法)
* LoadCompleted - 异步加载完成后所触发的事件
* LoadCompletedEventArgs - LoadCompleted 事件的事件参数
* LoadCompletedEventArgs.QueryOperationResponse - 获取数据服务对改查询操作的响应
* QueryOperationResponse.Error - 引发的异常
* QueryOperationResponse.Headers - http 的响应头
* QueryOperationResponse.Query - 对应的 DataserviceQuery(DataserviceQuery.requesturi - 请求数据服务的 URI) 对象
* QueryOperationResponse.StatusCode - http 的响应代码
* ConTinuation - 返回一个 DataserviceQueryConTinuation<T> 对象,该对象封装了当前查询结果的下一页的 URI
* DataserviceQueryConTinuation<T>.NextLinkUri - 当前查询结果的下一页的 URI
* LoadNextPartialSetAsync() - 加载下一页数据到 DataserviceCollection<T> 中
*
* Silverlight 通过 ObservableCollection<T> 与 ADO.NET Data services 1.0 进行通信详见 http://www.cnblogs.com/webabcd/archive/2009/03/12/1409281.html
* WCF Data services(ADO.NET Data services 1.5)新特性详见 http://www.cnblogs.com/webabcd/archive/2010/06/11/1756071.html
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;
using Silverlight40.MyWCFDataserviceReference;
using System.Data.services.CLIENt;
namespace Silverlight40.WCFDataservices
{
public partial class Demo : Page
{
private NorthwindEntities _context;
private DataserviceCollection<Category> _categories;
public Demo()
{
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs E)
{
// 指定数据服务地址
_context = new NorthwindEntities(new Uri("service/MyWCFDataservice.svc",UriKind.RelativE));
_categories = new DataserviceCollection<Category>();
_categories.LoadCompleted += new EventHandler<LoadCompletedEventArgs>(_categories_LoadCompleted);
// 演示如何通过 WCF Data services 做服务端分页
ServerPagingDemo();
}
// 开始异步加载 Categories 数据
private void btnGetData_Click(object sender,RoutedEventArgs E)
{
gridCategory.DataContext = null;
gridProduct.DataContext = null;
// 加载 Categories 表中的全部数据
var query = from c in _context.Categories SELEct c;
_categories.LoadAsync(query);
btnGetData.IsEnabled = false;
}
// 异步加载 Categories 数据完成
void _categories_LoadCompleted(object sender,LoadCompletedEventArgs E)
{
if (e.Error == null)
{
if (_categories.ConTinuation != null)
{
// 在数据服务中 Categories 被服务端分页了,所以需要不断调用 LoadNextPartialSetAsync() ,以便加载全部的 Categories 数据
_categories.LoadNextPartialSetAsync();
}
else
{
gridCategory.DataContext = _categories;
gridCategory.SELEctedIndex = 0;
btnGetData.IsEnabled = true;
}
}
else
{
messageBox.Show(e.Error.ToString());
btnGetData.IsEnabled = true;
}
}
// 开始异步加载指定 Category 下的 Products 数据
private void gridCategory_SELEctionChanged(object sender,SELEctionChangedEventArgs E)
{
Category category = gridCategory.SELEctedItem as Category;
if (category != null)
{
if (category.Products.Count == 0)
{
category.Products.LoadCompleted += new EventHandler<LoadCompletedEventArgs>(Products_LoadCompleted);
try
{
// 加载实体的导航属性数据
category.Products.LoadAsync();
}
catch (InvalidoperationException eX)
{
messageBox.Show(ex.ToString());
}
}
else
{
gridProduct.DataContext = category.Products;
}
}
}
// 异步加载 Products 数据完成
void Products_LoadCompleted(object sender,LoadCompletedEventArgs E)
{
if (e.Error == null)
{
DataserviceCollection<Product> products = sender as DataserviceCollection<Product>;
if (products.ConTinuation != null)
{
try
{
products.LoadNextPartialSetAsync();
}
catch (InvalidoperationException eX)
{
messageBox.Show(ex.ToString());
}
}
else
{
gridProduct.DataContext = products;
}
}
else
{
messageBox.Show(e.Error.ToString());
}
}
// 异步保存 Categories 中的被更新的数据(包括增删改),由于 Products 是 Category 的导航属性,所以相关的 Products 的数据的更新也会被保存
private void btnSave_Click(object sender,RoutedEventArgs E)
{
try
{
/*
* NorthwindEntities - 继承自 DataserviceContext,在 VS 中引用服务后会自动生成这个对象
* DataserviceContext.beginSaveChanges() - 将有变化的数据提交至数据服务端进行更新
* DataserviceContext.EndSaveChanges() - 获取 BeginSaveChanges() 操作的结果,返回一个 DataserviceResponse 类型的对象
*/
_context.beginSaveChanges(SaveChangesOptions.batch,OnChangesSaved,null);
}
catch (Exception eX)
{
messageBox.Show(ex.ToString());
}
}
// 数据被异步保存后
private void OnChangesSaved(IAsyncResult result)
{
bool error = false;
this.Dispatcher.beginInvoke(() =>
{
try
{
DataserviceResponse response = _context.EndSaveChanges(result);
foreach (ChangeOperationResponse changeResponse in responsE)
{
if (changeResponse.Error != null)
error = true;
}
if (!error)
{
messageBox.Show("数据更新成功");
}
else
{
messageBox.Show("数据更新失败");
}
}
catch (Exception eX)
{
messageBox.Show(ex.ToString());
}
});
}
privatE int _pageIndex = 0;
privatE int _pageSize = 3;
// 演示如何通过 WCF Data services 做服务端分页
private void ServerPagingDemo()
{
BindOrder();
btnNext.Click += (s,args) =>
{
_pageIndex++;
BindOrder();
};
btnPrev.Click += (s,args) =>
{
_pageIndex--;
BindOrder();
};
}
private void BindOrder()
{
txtCurrentPageIndex.Text = "当前页索引:" + _pageIndex.ToString();
var query = from o in _context.orders SELEct o;
query = query.Skip(_pageIndex * _pageSizE).Take(_pageSizE);
DataserviceCollection<Order> orders = new DataserviceCollection<Order>();
orders.LoadAsync(query);
orders.LoadCompleted += (s,args) =>
{
gridOrder.DataContext = orders;
};
}
}
}
OK
以上是大佬教程为你收集整理的稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data Services 进行通信全部内容,希望文章能够帮你解决稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data Services 进行通信所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。