|
在WPF中,DataSourceProvider是一个较为特别的类型。其提供了对复杂数据获取逻辑的支持。例如该类的派生类XmlDataProvider提供了对XML数据进行分析的支持,而ObjectDataProvider则允许软件开发人员调用创建数据实例的函数。 也正是由于这些类型的使用较为生僻,因此许多软件开发人员并不能很好地使用它们。实际上,DataSourceProvider是一个非常强大的数据源框架,允许您通过继承的方式为不同的数据源,如SQL Server,提供绑定支持。 在下面的介绍中,本文主要分析DataSourceProvider作为数据源框架所提供的功能以及如何在各个扩展点中使用这些功能,并通过示例展示了这些功能的使用。 一.DataSourceProvider 为了更好地在派生类中使用基类DataSourceProvider所提供的功能,您有必要首先了解一下该类型所提供的绑定源框架。 DataSourceProvider类所提供的最重要的扩展点就是BeginQuery()函数。 BeginQuery()函数的语义特征非常明显:执行对数据的查询,以完成对参与绑定的数据源的刷新。例如XmlDataProvider.BeginQuery()的定义如下: 1 protected override void BeginQuery() 这段代码展示了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()函数之中,即对属性进行设置这一步骤之后,以保证执行逻辑在执行时所需属性均已设置完毕。 |





骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价