silverlight
发布时间:2022-05-04 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data Services 进行通信,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
概述
[源码下载] 稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data
services 进行通信 作者: webabcd 介绍 Silverlight 4.0 对 WCF Data
services 的支持: Data
serviceCollection<T> - 继承自 ObservableCollection<T>,用于将 WCF Data
services 提供的数据
[源码下载]
稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data
services 进行通信
作者:
webabcd
介绍
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、服务端
@H_582_18
@myWCFData
service.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
<
@H_831_62
@mode
l.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_994_11845@as.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://scheR_994_11845@as.microsoft.com/winfx/2006/xaml"
xmlns:d
="http://scheR_994_11845@as.microsoft.com/expression/blend/2008"
xmlns:mc
="http://scheR_994_11845@as.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:sdk
="http://scheR_994_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.xam
l.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,请注明来意。