利用Binding扩展Silverlight控件(二)
2011-03-29 18:28
274 查看
文中所有代码片段是手工输入,并非从项目中拷贝而来,因此不能保证其准确无误,仅为了配合所阐述的思路。
在上文中我们利用Binding构建了一个简单的DependencyPropertyWatcher类,可以使我们挂接一个回调函数检测任何DependencyProperty属性的变化,接下来我们就利用它来扩展DataPager,使它更符合我们习惯的外观和信息。
首先查看原生DataPager的ControlTemplate,发现如下定义:
其中Horizontal排列的StackPanel就是DataPager的主要呈现容器了(在上一文中有提到),不过它没有提供Name属性,因此我们只能从名为Root的Grid开始顺藤摸瓜来得到它的引用,并在尾部加上一个TextBlock准备呈现文字信息。代码如下:
[code]{
[/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的定义也相当简洁:
[code]{
[/code]
在DataPager的Source属性发生变化的时候,我们获取到新的Source值,如果是PagedCollectionView对象,则处理它的PropertyChanged事件,如果要提供详细的细节也可以处理CollectionChanged事件,不过对于我们的习惯,PropertyChanged就足够处理了。UpdateCountString就非常随意了,可以根据自己的爱好处理,最好的当然是为我们的新DataPager提供一个StringFormat属性,不过这不是本文的重点,这里我只提供一个最简单的实现:
[code]{
[/code]
好了,至此一个带有文字信息的DataPager已经完成。最后附上两个效果图:
在上文中我们利用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已经完成。最后附上两个效果图:
相关文章推荐
- 利用Binding扩展Silverlight控件(三)
- 利用Binding扩展Silverlight控件(一)
- 通过Silverlight中Calendar控件的扩展学习XAML(上)
- Silverlight实用窍门系列:59.多个中心点联动多线的可拖动控件扩展为拓扑图
- (转)利用MS AJAX 扩展服务器端控件
- Bing Maps Silverlight地图控件的扩展版(Ldh.Maps.V1.1)
- Bing Maps Silverlight地图控件的扩展版(Ldh.Maps.V1.0)
- 通过扩展Silverlight的控件DataGrid,使其垂直滚动条支持鼠标滑轮 (转)
- 扩展SilverLight的DataPager控件
- 扩展SilverLight的DataPager控件 (转)
- Silverlight中DataPager控件扩展
- Silverlight实用窍门系列:59.多个中心点联动多线的可拖动控件扩展为拓扑图
- 通过Silverlight中Calendar控件的扩展学习XAML(下)
- 利用IExtenderProvider扩展控件属性
- Silverlight/wpf DataGrid TextBox 等控件内容 Binding 中日期格式 StringFormat
- WPF 利用Binding 查询数据库 遍历前台控件
- Bing Maps Silverlight地图控件的扩展版Ldh.Maps.V1.1问题
- Silverlight/wpf DataGrid TextBox 等控件内容 Binding 中日期格式 StringFormat
- 通过扩展Silverlight的控件DataGrid,使其垂直滚动条支持鼠标滑轮
- Silverlight/wpf DataGrid TextBox 等控件内容 Binding 中日期格式 StringFormat