您的位置:首页 > 其它

利用Binding扩展Silverlight控件(二)

2011-03-29 18:28 274 查看
文中所有代码片段是手工输入,并非从项目中拷贝而来,因此不能保证其准确无误,仅为了配合所阐述的思路。

在上文中我们利用Binding构建了一个简单的DependencyPropertyWatcher类,可以使我们挂接一个回调函数检测任何DependencyProperty属性的变化,接下来我们就利用它来扩展DataPager,使它更符合我们习惯的外观和信息。

首先查看原生DataPager的ControlTemplate,发现如下定义:





其中Horizontal排列的StackPanel就是DataPager的主要呈现容器了(在上一文中有提到),不过它没有提供Name属性,因此我们只能从名为Root的Grid开始顺藤摸瓜来得到它的引用,并在尾部加上一个TextBlock准备呈现文字信息。代码如下:

publicoverridevoidOnApplyTemplate()

[code]{
base.OnApplyTemplate();


Gridgrid=(Grid)GetTemplateChild("Root");

Borderborder=(Border)grid.Children[0];

StackPanelpanel=(StackPanel)border.Child;


countText=newTextBlock();

countText.Margin=newThickness(10,0,5,0);

countText.FontSize=12;

countText.FontFamily=newSystem.Windows.Media.FontFamily("SimSun");

countText.VerticalAlignment=VerticalAlignment.Center;


_Watcher.Attach(this,"Source",SourceChanged);


panel.Children.Add(countText);

}

[/code]

这里我们着重于实现扩展,TextBlock的设置简单的以硬编码形式提供。

接下来我们要做的工作就是当我们感兴趣的属性发生变化时,及时的更新countText的文本属性,一般来说我们会把一个PagedCollectionView对象作为DataPager的Source,整理一下,按照习惯我们需要对PagedCollectionView的Count属性(当前显示数量)、ItemCount属性(总计数量)、PageIndex(当前页索引)以及DataPage本身的PageCount属性(总页数)的变化做出响应。最直接的办法,当然是使用DependencyPropertyWatcher类类对每个属性都加上Changed回调,比如Attach(this,“Source.Count”,CountChanged)等。不过查看PagedCollectionView的定义,它已经实现了INotifyCollectionChanged和INotifyPropertyChanged接口,因此事实上我们只需要关注Source的改动,然后利用这2个接口的事件就可以对上述的所有属性变化做出响应,DataPager本身的PageCount属性事实上与PageCollectionView的PageSize和ItemCount相关,不必要单独处理。因此虽然要处理的属性比较多,但是在上面的代码中,我们仅仅在15行处使用了一个Attach,而SoureChanged的定义也相当简洁:


privatevoidSourceChanged(objectvalue)

[code]{
PagedCollectionViewpcv=(PagedCollectionView)value;


if(pcv!=null)

{

pcv.PropertyChanged+=newSystem.ComponentModel.PropertyChangedEventHandler(pcv_PropertyChanged);

}


UpdateCountString();

}


voidpcv_PropertyChanged(objectsender,System.ComponentModel.PropertyChangedEventArgse)

{

UpdateCountString();

}

[/code]

在DataPager的Source属性发生变化的时候,我们获取到新的Source值,如果是PagedCollectionView对象,则处理它的PropertyChanged事件,如果要提供详细的细节也可以处理CollectionChanged事件,不过对于我们的习惯,PropertyChanged就足够处理了。UpdateCountString就非常随意了,可以根据自己的爱好处理,最好的当然是为我们的新DataPager提供一个StringFormat属性,不过这不是本文的重点,这里我只提供一个最简单的实现:


privatevoidUpdateCountString()

[code]{
PagedCollectionViewpcv=(PagedCollectionView)Source;


intpageCount=1;

intcount=0;

intitemCount=0;

intpageIndex=0;


if(pcv!=null)

{

pageCount=PageCount;

count=pcv.Count;

itemCount=pcv.ItemCount;

pageIndex=pcv.PageIndex;

}


countText.Text=string.Format("总计{0}条记录共{1}页当前第{2}页显示{3}条",itemCount,pageCount,pageIndex+1,count);

}

[/code]

好了,至此一个带有文字信息的DataPager已经完成。最后附上两个效果图:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: