在使用Telerik的DataPager进行服务器端分页那篇里面,我使用了一个List<int>列表作为DataPager的Source,总感觉有点牵强。另外,PageIndex="{Binding PageIndex}"总是不能将PageIndex的更改传到ViewModel当中,最后使用了PageIndexChanged事件实现PageIndex的更显,破坏了ViewModel的完整性。昨天看了一下Telerik:DataPager的API,发现其支持ItemCount、PageIndex、PageCount等依赖属性,我下想:为什么一定要Source属性呢,知道上面三个参数对于DataPager已经足够了,PageIndex不能自动更新到后台可能是DataPager默认是单项绑定的原因。好了,赶紧实验吧:
1.前台界面
1 <StackPanel> 2 <telerik:RadGridView ItemsSource="{Binding EmailList}" AutoGenerateColumns="False" CanUserInsertRows="False" CanUserDeleteRows="False" IsReadOnly="True" EnableColumnVirtualization="False" EnableRowVirtualization="False" IsFilteringAllowed="False" ShowGroupPanel="False" CanUserReorderColumns="False" CanUserSortColumns="False"> 3 <telerik:RadGridView.Columns> 4 <telerik:GridViewDataColumn Header="账号" DataMemberBinding="{Binding UserName}" Width="100" TextAlignment="Left" HeaderTextAlignment="Center"/> 5 <telerik:GridViewDataColumn Header="密码" DataMemberBinding="{Binding Password}" Width="100" TextAlignment="Left" HeaderTextAlignment="Center"/> 6 </telerik:RadGridView.Columns> 7 </telerik:RadGridView> 8 <telerik:RadDataPager x:Name="mailPager" ItemCount="{Binding ItemCount,Mode=TwoWay}" PageSize="20" PageIndex="{Binding PageIndex,Mode=TwoWay}" DisplayMode="FirstLastPreviousNext, Text"/> 9 </StackPanel>
对ItemCount和PageIndex属性指定绑定模式为双向绑定,确保数据能够返回到ViewModel当中。
2.后台代码
public NetsMail() { InitializeComponent(); this.DataContext = new NetsMailViewModel(); }
后台代码也不需要处理PageIndexChanged事件了。
3.ViewModel类
public class NetsMailViewModel : NotificationObject { [Import(typeof(INetsDesktopContract))] public INetsDesktopContract NetsService { get; set; } public NetsMailViewModel() { NetsService = App.Container.GetExportedValue<INetsDesktopContract>(); int count; emailList = NetsService.GetEmailAccounts(0, 20, out count); PageIndex = 0; ItemCount = count; } private List<Email> emailList; public List<Email> EmailList { get { return emailList; } set { emailList = value; this.RaisePropertyChanged("EmailList"); } } private int pageIndex; public int PageIndex { get { return pageIndex; } set { int count; pageIndex = value; EmailList = NetsService.GetEmailAccounts(pageIndex, 20, out count); ItemCount = count; this.RaisePropertyChanged("PageIndex"); } } private int itemCount; public int ItemCount { get { return itemCount; } set { itemCount = value; this.RaisePropertyChanged("ItemCount"); } } }
大功告成,是不是看起来清爽多了。放一下最终效果图。