当前位置: 首页 > web开发 > Silverlight > 正文

使用LINQ和ADO.NET创建Silverlight程序(6)

时间:2011-10-23 51CTO 黄永兵 译

变化管理

ADO.NET Data Service客户端库不支持对象的自动变更监视,这意味着当对象,集合和关系发生变化 时,需要开发人员告诉DataServiceContext这些变化,通知DataServiceContext对象的API相当简单,如 例4所示:

例4 DataServiceContext变更API

方法 描述
AddObject 添加一个新创建的对象
UpdateObject 标记一个已经变化的对象
DeleteObject 标记一个删除的对象
AddLink 在两个对象之间添加一个链接
UpdateLink 更新两个对象之间的链接
DeleteLink 删除两个对象之间的链接

这意味着你要监视对象的变化,并在你自己的代码中通知DataServiceContext对象,表面上 看起来这样让人很失望,因为没有实现自动化的变化管理,但这样可以让库变得更有效也更mini。

你可能会对如何监视对象的变化感到奇怪,答案就是生成的代码中,在每个生成的data contract类中 ,当类中的数据变化时partial方法被调用,如果这些方法从来没有使用过,它们本身不会造成任何资源 消耗,你可以在任何支持变化通知的data contracts上使用partial方法机制,只需要在partial方法中调 用DataServiceContract即可,不用连接DataServiceContract整个类。

幸运的是,Silverlight已经有一个接口支持变化通知了(INotifyPropertyChange),通过这个接口 可以在你的实现中将任何变化通知给感兴趣的人,例如你可以在你的data contract类(在我们的例子中 是Product类)中调用InotifyPropertyChange定义一个事件,当数据发生变化时可以激活它,下面就是具 体的示例:

public partial class Product : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}

这样当任何属性发生变化时都可以触发一个事件,你可以通过partial方法决定什么时候触发这个事件 ,例如,当ProductName发生变化时要通知预定人,只需要调用OnProductNameChanged方法,然后触发 PropertyChanged事件,传递ProductName通知变化的属性给事件预定人,下面是代码:

partial void OnProductNameChanged()
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("ProductName"));
}
}

通过在这些可写的属性上调用这些partial方法,监视你对象的变化就很简单了,当对 象发生变化时,你可以注册PropertyChanged事件然后通知DataServiceContext对象:

//在OnLoadComplete方法中,获取结果然后将它们添加到集合中
List products = productQuery.EndExecute(result).ToList();
foreach (Product product in products)
{
//触发变化通知
product.PropertyChanged += new PropertyChangedEventHandler(product_PropertyChanged);
}

最后你可以调用product_PropertyChanged方法通知DataServiceContext对象:

void product_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Product product = (Product)sender;
TheContext.UpdateObject(product);
}