ListBox和ListView在应用中,常常有需求关于每页显示固定数量的数据,然后通过Timer自动或者手动翻页操作,本文介绍到的就是该动作的实现。
一.重点
对于ListBox和ListView来讲,后台绑定的ItemSource绑定的一般都是List<T>格式,而List<T>有个方法是Take和Skip,分别意思是取List部分和跳过List部分。
取数据的格式是:List.take().Skip();
二.话不多说,实例说话(后面会附有该例子链接,仅供参考)
(1)Xaml界面上:
<StackPanel> <ListBox Height="300" ScrollViewer.VerticalScrollBarVisibility="Disabled" ItemsSource="{Binding ListShow}"></ListBox> <Button x:Name="TurnUpButton" Content="上翻页" Click="TurnPageUp" Height="50" /> <Button x:Name="TurnDownButton" Content="下翻页" Click="TurnPageDown" Height="50"/> <Button Content="自动翻页" Click="Button_Click_1" Height="50"/> </StackPanel>
ListBox是数据显示区域,三个Button的Content已写明各自功能。
(2)CS代码
public partial class MainWindow : Window { public ObservableCollection<string> ListShow { get { return (ObservableCollection<string>)GetValue(ListShowProperty); } set { SetValue(ListShowProperty, value); } } public List<string> NameList = new List<string>(); public MainWindow() { InitializeComponent(); //WPF数据绑定 this.DataContext = this; //假数据创建 Data(); //数据显示 ContentShow(); //Timer初始化 为自动翻页做准备 TimeSet(); } private void Data() { for (int i = 0; i < 30; i++) { string s = "Name" + i.ToString(); NameList.Add(s); } } private void ContentShow() { ListShow = new ObservableCollection<string>(NameList.Take(PageSize * Page).Skip(PageSize * (Page - 1))); if (NameList.Count % PageSize == 0) { Total = NameList.Count / PageSize; } else { Total = NameList.Count / PageSize + 1; } TurnUpButton.Visibility = Page > 1 ? Visibility.Visible : Visibility.Hidden; TurnDownButton.Visibility = Page < Total ? Visibility.Visible : Visibility.Hidden; } private void TimeSet() { timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(5); timer.Tick += timer_Tick; } void timer_Tick(object sender, EventArgs e) { if (Page < Total) { Page++; ContentShow(); } else { Page = 1; ContentShow(); } } private void Button_Click_1(object sender, RoutedEventArgs e) { if (IsOpen == true) { IsOpen = false; timer.Stop(); } else { timer.Start(); IsOpen = true; } } private void TurnPageUp(object sender, RoutedEventArgs e) { Page--; ContentShow(); } private void TurnPageDown(object sender, RoutedEventArgs e) { Page++; ContentShow(); } DispatcherTimer timer; private bool IsOpen; private int Page = 1; private int Total; private int PageSize = 7; public static readonly DependencyProperty ListShowProperty = DependencyProperty.Register("ListShow", typeof(ObservableCollection<string>), typeof(MainWindow), new PropertyMetadata(new ObservableCollection<string>())); }
ListShow是Xaml的ListBox的ItemSource绑定对象,所有数据都是通过ListShow显示到界面上的。
强调一定要用ObservableCollection<T>类型,这样才能在ListShow数据发生改变后,界面自动刷新,普通List<T>赋值上去是不会刷新界面的。
Page--当前页数。PageSize--每页数据数量。Total--总页数。
ListShow = new ObservableCollection<string>(NameList.Take(PageSize * Page).Skip(PageSize * (Page - 1)));
Take取PageSize*Page条数据,Skip跳过(PageSize*(Page-1))条数据,实际获取的就是1页的数据,即1个PageSize。
下面两条代码是为了限制在Page在首页和尾页时,不能继续向前翻和后翻,而设置的可见不可见。
TurnUpButton.Visibility = Page > 1 ? Visibility.Visible : Visibility.Hidden; TurnDownButton.Visibility = Page < Total ? Visibility.Visible : Visibility.Hidden;
三.易错点
(1)timer一定要用DispatcherTimer,如果只是用Timer会因为线程问题而不能实现自动翻页。
(2)依赖属性的Register中最后面的New PropertyMedata中是new出来一个空的ObservableCollection<string>(),不是String.Empty或者Null
四.代码下载