技术开发 频道

Windows phone平台基于页面的列表浏览

  【IT168技术】在Windows Phone上,浏览列表中内容的方法有多种,大多数应用程序(如Facebook)使用“载入更多(Load More)”方法 – 通过修改默认的ItemPresenter,可以在末尾处增加一个额外的按钮控件触发列表更新,这是最常见的一种数据集拆分做法,但当所有数据项全部载入,需要切换显示时又该怎么处理呢?

  我决定尝试不同的方法,在列表中使用伪页面切换,我称之为伪页面是因为我没有使用真正的页面,而是使用了一个快速绑定技巧遍历整个列表,例如,我们假设有一个ListBox绑定了一些位于ViewModel中的数据集:

<ListBox x:Name="MainList">
</ListBox>

  我也在主页(列表所在位置)上添加了两个按钮:一个按钮向后浏览,一个按钮向前浏览,这样在列表中显示的条目数量就是固定的。

  注意这里没有前期的绑定显示,翻页链接将在整个数据集加载完毕后显示。

  在我的示例应用程序中,显示了一个ViewModel,包含一些普通的数据,首先,我获得总页数(TotalPages)和当前页码(CurrentPage),这些数字是根据数据集计算出来的,例如,下面是计算总页数的方法:

ViewModel.TotalPages = ((int)Math.Ceiling((double)total/(double)10));

  这里的total是全局数据集的记录总数,10是每个页面显示的记录条数,当然这个数字是可以修改的。

  当我跨页面切换时,我需要记录当前的起始点,我使用GetRange遍历数据集的子集,一块一块地显示,而不是载入全部数据集。

  首先,变量current记录在数据集中的位置,它是一个整数,初始值为0,你可以将它放在主页的任何地方(切换操作发生的地方)。

  现在让我们来看看如何实现向前浏览:

if (ViewModel.CurrentPage < ViewModel.TotalPages)
{
current
+= 10;
if (ViewModel.CurrentPage == ViewModel.TotalPages - 1)
{
MainList.ItemsSource
= ViewModel.MyCollection.GetRange(current,
Convert.ToInt32(ViewModel.TotalItemsInCollection)
- (ViewModel.CurrentPage * 10));
}
else
{
MainList.ItemsSource
= ViewModel.Games.GetRange(current, 10);
}
ViewModel.CurrentPage
++;
}

  首先需要做的事情是确保当前页面有一个小于总页数的值,那样,如果用户处于最后一页,就无法再继续向前浏览,否则会导致异常,因为每一页显示10条记录,因此增量值也是10。

  值得注意的是,由于数据集记录是从0开始编号的,记录10实际上是第11条记录,它将显示在第二页的第一行。

  如果页面是最后一页的前一页,需要使用下面的计算公式准确地计算出页面中显示的记录条数:

  拉取的记录数量=数据集中的总记录数-(最后一页之前的页数*每一页的记录数)

  从数据集拉取记录时应该从current(起始点)开始,如果页面不是最后一页的前一页,我们只需要拉取下一个10条记录即可,获取到记录后,后面的页面递增。

  向后浏览的实现方法也很简单,做相反的操作:

if (ViewModel.CurrentPage != 1)
{
current
-= 10;
MainList.ItemsSource
= ViewModel.MyCollection.GetRange(current, 10);
ViewModel.CurrentPage
--;
}

  这里的例子很简单,我对指针做递减操作,页码也做递减,这样我就给列表加上了基于页面的前/后浏览方式。

0
相关文章