大佬教程收集整理的这篇文章主要介绍了Silverlight Wcf 获取集合数据并绑定(DataContract,DataMember),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在之前写的一篇文章中,提到当在WCF中创建一个类,SL中引用该WCF服务后该类会变成 XXClient的样子,当初初学(现在也是,不过要好一点点),对Wcf服务和Sl之间的关系看得比较片面。其实在Wcf中创建serviceContract契约标注的类的时候才会在Sl中变成XXClient的形式的类,而还有一种创建Wcf类的契约指定DataContract,这个契约的用途主要是制订一个类的数据结构,提供给引用其服务的客户端共享类型。
在通过wcf将一个数据集合传递给Sl的时候,我们会发现,异步完成事件的参数e的Result获得的数据集合是System.Collections.ObjectModel.observableCollection泛型的,如果,我们的wcf中返回的是一个DataView,那么在Sl中绑定这个结果是会出错的,因为Sl中并没提供DataView类,那怎么办呢?
于是,我们就会想自己写一个数据集合类来返回给SL,那么SL那边是不是也要写个相同的类来接收?Sl的数据绑定是可以通过绑定类的属性来实现的,但是,wcf上定义的类如何让Sl知道就是和他自己定义的类是一样的??
我们是写的一样的,可是SL不这么认为,就算一模一样,他们依然是两个类,不可共用的,也不存在继承关系。
于是,在创建wcf就得用DataContract定义一个类型出来,这样定义之后,sl上就可以共享这个类了,这个服务被sl引用后,这个类就跟sl自己的一样,sl和wcf签订了一个契约,我们都用这个类吧。这时,问题就解决了。
我们获取一个数据集合,比如说DataView ,然后将这个集合中的每一项的每一个字段作为属性赋值给那个DataContract指定的类的实例,有多少项就得创建多少个这个类的实例,然后创建一个List泛型来存储这一堆的实例。之后我们就将List泛型返回给SL,Sl获得这个List集合后,一看,泛型指定的是DataContract定义的类,正是wcf契订的那个类,sl引用了这个服务,当然也就共享了这个类,这个类也是sl自己的,好,sl虽然获得的依然是System.Collections.ObjectModel.observableCollection泛型,但是泛型里的类型是它所了解的那个类,那么就可以直接将结果绑定到类似DataGrid的控件上了。
DataContract标注这个类的时候,其要勇于共享的字段或属性需要用DataMember标注,就像serviceContract标注的类里的要共享的方法需要用OperationContract标注一样。
很困了,随便写,改天有空整理,白话讲出来也就这个意思。
另外,Sl中 DataGrid绑定数据时,实际上是绑定一个由N个类实例组合的集合,该集合的每一项就是一个类实例,DataGird绑定这个集合的时候,每一行是一项,每一行的每一列是该项的类的每一个属性。也就是说,一行就是一个类实例,一列就是一个实例的一个属性
太困了
贴点代码:
wcf
using System;
using System.Linq;
using System.Runtime.serialization;
using System.serviceModel.Activation;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace QiWeiXian
[serviceContract(Namespace = "Qiweixian.com")]
[AspNetCompatibilityrequirements(requirementsMode = AspNetCompatibilityrequirementsMode.Allowed)]
public class WebWcf
public List<BookItem> GetBookList()
DataView dv = new DataView();
DataClass dc = new DataClass();
dv = dc.GetBooks(datetiR_937_11845@e.Now.Date,datetiR_937_11845@e.Now.Date.AddDays(1));
dv.sort = "ID Desc";
List<BookItem> list = new List<BookItem>();
for (int i = 0; i < dv.Count; i++)
bi = new BookItem();
bi.Name = dv[i]["Name"].ToString();
bi.Peoples = (int)dv[i]["Peoples"];
bi.Phone = dv[i]["Phone"].ToString();
bi.REMARK = dv[i]["REMARK"].ToString();
bi.REMARK2 = dv[i]["REMARK2"].ToString();
bi.Status = (int)dv[i]["Status"];
bi.AddTime = (datetiR_937_11845@e)dv[i]["AddTime"];
bi.bookTime = (datetiR_937_11845@e)dv[i]["BookTime"];
list.Add(bi);
}
[DataContract]
public class BookItem
public String Name;
public datetiR_937_11845@e BookTime;
public datetiR_937_11845@e AddTime;
public String Phone;
}
}
sl cs
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.Media.Animation;
namespace BookOnline
public partial class Page : UserControl
InitializeComponent();
private void UserControl_Loaded(object sender,RoutedEventArgs E)
BookListBind();
WebWcf.WebWcfClient wc = new BookOnline.WebWcf.WebWcfClient();
wc.GetBookListAsync();
wc.GetBookListCompleted += new EventHandler<BookOnline.WebWcf.GetBookListCompletedEventArgs>(wc_GetBookListCompleted);
void wc_GetBookListCompleted(object sender,BookOnline.WebWcf.GetBookListCompletedEventArgs E)
System.Collections.ObjectModel.ObservableCollection<BookOnline.WebWcf.BookItem> members = e.Result;
BookList.Itemssource = members;
}
}
以上是大佬教程为你收集整理的Silverlight Wcf 获取集合数据并绑定(DataContract,DataMember)全部内容,希望文章能够帮你解决Silverlight Wcf 获取集合数据并绑定(DataContract,DataMember)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。