王燕丽

博客园 首页 联系 订阅 管理

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

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

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

1

其中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已经完成。最后附上两个效果图:

2

3

posted on 2011-03-29 18:28  王燕丽  阅读(513)  评论(0)    收藏  举报