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 的支持: DataserviceCollection<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@myWCFDataservice.svc.cs

稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data Services 进行通信

代码
/*
 * 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@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

稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data Services 进行通信

代码
< 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:DataGridTextcolum Header ="类别ID"  Binding =" {Binding CategoryID} "  IsReadOnly ="True"   />
                    
< sdk:DataGridTextcolum 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:DataGridTextcolum Header ="产品ID"  Binding =" {Binding ProductID} "  IsReadOnly ="True"   />
                    
< sdk:DataGridTextcolum Header ="产品名称"  Binding =" {Binding ProductNamE} "   />
                    
< sdk:DataGridTextcolum 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:DataGridTextcolum Header ="订单ID"  Binding =" {Binding OrderID} "   />
                    
< sdk:DataGridTextcolum 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(56) - 4.0通信之与 WCF Data Services 进行通信

代码
/*
 * 演示 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)
        {
            
//  指定数据服务地址
            _contex =   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.DataContex
=   null ;
            gridProduct.DataContex
=   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.DataContex
=  _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.DataContex
=  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.DataContex
=  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.DataContex
=  orders;
            };
        }
    }
}

OK
[源码下载]

大佬总结

以上是大佬教程为你收集整理的稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data Services 进行通信全部内容,希望文章能够帮你解决稳扎稳打Silverlight(56) - 4.0通信之与 WCF Data Services 进行通信所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。