文中所有代码片段是手工输入,并非从项目中拷贝而来,因此不能保证其准确无误,仅为了配合所阐述的思路。
在上文中我们利用Binding构建了一个简单的DependencyPropertyWatcher类,可以使我们挂接一个回调函数检测任何DependencyProperty属性的变化,接下来我们就利用它来扩展DataPager,使它更符合我们习惯的外观和信息。
首先查看原生DataPager的ControlTemplate,发现如下定义:
其中Horizontal排列的StackPanel就是DataPager的主要呈现容器了(在上一文中有提到),不过它没有提供Name属性,因此我们只能从名为Root的Grid开始顺藤摸瓜来得到它的引用,并在尾部加上一个TextBlock准备呈现文字信息。代码如下:
1: public override void OnApplyTemplate()
2: {
3: base.OnApplyTemplate();
4:
5: Grid grid = (Grid)GetTemplateChild("Root");
6: Border border = (Border)grid.Children[0];
7: StackPanel panel = (StackPanel)border.Child;
8:
9: countText = new TextBlock();
10: countText.Margin = new Thickness(10, 0, 5, 0);
11: countText.FontSize = 12;
12: countText.FontFamily = new System.Windows.Media.FontFamily("SimSun");
13: countText.VerticalAlignment = VerticalAlignment.Center;
14:
15: _Watcher.Attach(this, "Source", SourceChanged);
16:
17: panel.Children.Add(countText);
18: }
这里我们着重于实现扩展,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的定义也相当简洁:
1: private void SourceChanged(object value)
2: {
3: PagedCollectionView pcv = (PagedCollectionView)value;
4:
5: if (pcv != null)
6: {
7: pcv.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(pcv_PropertyChanged);
8: }
9:
10: UpdateCountString();
11: }
12:
13: void pcv_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
14: {
15: UpdateCountString();
16: }
在DataPager的Source属性发生变化的时候,我们获取到新的Source值,如果是PagedCollectionView对象,则处理它的PropertyChanged事件,如果要提供详细的细节也可以处理CollectionChanged事件,不过对于我们的习惯,PropertyChanged就足够处理了。UpdateCountString就非常随意了,可以根据自己的爱好处理,最好的当然是为我们的新DataPager提供一个StringFormat属性,不过这不是本文的重点,这里我只提供一个最简单的实现:
1: private void UpdateCountString()
2: {
3: PagedCollectionView pcv = (PagedCollectionView)Source;
4:
5: int pageCount = 1;
6: int count = 0;
7: int itemCount = 0;
8: int pageIndex = 0;
9:
10: if (pcv != null)
11: {
12: pageCount = PageCount;
13: count = pcv.Count;
14: itemCount = pcv.ItemCount;
15: pageIndex = pcv.PageIndex;
16: }
17:
18: countText.Text = string.Format("总计{0}条记录 共{1}页 当前第{2}页 显示{3}条", itemCount, pageCount, pageIndex + 1, count);
19: }
好了,至此一个带有文字信息的DataPager已经完成。最后附上两个效果图:

浙公网安备 33010602011771号