silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了稳扎稳打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 控件上,当数据发生变化时可

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

源码下载:http://files.cnblogs.com/webabcd/Silverlight.rar

@H_359_403@

大佬总结

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

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

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