Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 LINQ ADO.NET JavaScript DataGridView GridView AjaxPro DevExpress 面向对象 Extjs XML HTML教程 Oracle jQuery WPF MVC 分页 Office2010 GDI+ Visual C++2010 Dojo MySQL VB.NET WCF4.0 ASPxGridView WinForm textbox Sql2005 cookie Discuz!NT checkbox WCF SQL经典语句 T-SQL F# asp.net VS2008 SQL Ajax DropDownList VS2008新特性 TreeView Access Flex 页面执行时间 字符串 DataSet VB2005 回调 动画 C#时间 游戏 ASP.NET MVC
FrameworkC#技术 VB.NET VC.NET WCF WPF
当前位置: 主页 > WinForm教程 > C#技术 >

自定义DataSourceProvider

时间:2012-02-07 16:14来源:未知 作者:admin 点击:

在WPF中,DataSourceProvider是一个较为特别的类型。其提供了对复杂数据获取逻辑的支持。例如该类的派生类XmlDataProvider提供了对XML数据进行分析的支持,而ObjectDataProvider则允许软件开发人员调用创建数据实例的函数。

  也正是由于这些类型的使用较为生僻,因此许多软件开发人员并不能很好地使用它们。实际上,DataSourceProvider是一个非常强大的数据源框架,允许您通过继承的方式为不同的数据源,如SQL Server,提供绑定支持。

  在下面的介绍中,本文主要分析DataSourceProvider作为数据源框架所提供的功能以及如何在各个扩展点中使用这些功能,并通过示例展示了这些功能的使用。

一.DataSourceProvider

  为了更好地在派生类中使用基类DataSourceProvider所提供的功能,您有必要首先了解一下该类型所提供的绑定源框架。

  DataSourceProvider类所提供的最重要的扩展点就是BeginQuery()函数。

  BeginQuery()函数的语义特征非常明显:执行对数据的查询,以完成对参与绑定的数据源的刷新。例如XmlDataProvider.BeginQuery()的定义如下:

1 protected override void BeginQuery()
2 {
3     if (this._source != null)
4     { // 放弃内嵌XML的设置而加载Source属性所指定的XML
5         this.DiscardInline();
6         this.LoadFromSource();
7     }
8     else
9     {
10         XmlDocument state = null;
11         if (this._domSetDocument != null)
12         { // 放弃内嵌XML的设置而加载Document属性所指定的XML
13             this.DiscardInline();
14             state = this._domSetDocument;
15         }
16         else
17         {
18             if (this._inEndInit)
19                 return;
20             state = this._savedDocument;
21         }
22         // 创建XML树状结构
23         if (this.IsAsynchronous && (state != null))
24             ThreadPool.QueueUserWorkItem(new
25                 WaitCallback(this.BuildNodeCollectionAsynch), state);
26         else if ((state != null) || (base.Data != null))
27             this.BuildNodeCollection(state);
28     }
29 }

这段代码展示了XmlDataProvider是如何执行对XML文档的解析:首先考虑Source属性所指定的XML文件,接下来则是Document属性所表示的XML,而最后则是内嵌的XML。当然,XmlDataProvider的XML文档解析顺序并不属于本文的范畴,因此在这里我们跳过这个话题。

  那么什么时候BeginQuery()函数会被调用呢?答案是Refresh()函数。该函数是一个公有函数,以允许被用户代码显式调用。同时在DataSourceProvider的各个派生类实现中,如果对一个属性的更改会导致DataSourceProvider所生成的数据发生变化,那么Refresh()函数也应被调用。例如XmlDataProvider的Document属性就在发生更改时调用了Refresh()函数:

1 public XmlDocument Document
2 {
3     get
4     {
5         return this._document;
6     }
7     set
8     {
9         if (((this._domSetDocument == null) || (this._source != null))
10             || (this._document != value))
11         {
12             this._domSetDocument = value;
13             this._source = null;
14             this.OnPropertyChanged(new PropertyChangedEventArgs("Source"));
15             this.ChangeDocument(value);
16             if (!base.IsRefreshDeferred)
17                 base.Refresh();
18         }
19     }
20 }  接下来看看该类型所实现的接口。DataSourceProvider实现了INotifyPropertyChanged以及ISupportInitialize接口。接口INotifyPropertyChanged用来提供对绑定的支持。对该接口的详细介绍请见绑定及惯用法(一)一文,这里不再赘述。而ISupportInitialize接口则用来完成对批量初始化的支持:在加载XAML的时候,程序将创建XAML元素所对应的类型实例。如果该类型实现了ISupportInitialize接口,那么在设置该实例的各个属性值之前,BeginInit()函数将被调用;在完成了对所有属性的设置之后,EndInit()函数将被调用。通过这种方法可以解决的一个问题是:对于某些具有相互关联关系的属性,对它们的使用可以置于EndInit()函数之中,即对属性进行设置这一步骤之后,以保证执行逻辑在执行时所需属性均已设置完毕。
Tags:
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价