我正在使用ObservableCollection
方法Skip
在用户按下n
Next
时显示列表中的下一个Button
项。< / p>
是否有方法或简单的方法来做相反的事情?那是在列表中倒退了吗?
这就是我现在正在使用的。
myObservableCollectionObject.Skip(5).Take(5);
如果我刚看到6 - 10
,这会显示项1 - 5
。当按下另一个Button
时,我想显示之前的5个项目(1 - 5)
。
答案 0 :(得分:2)
您可以保留一个索引,通过前进/后退按钮更改,将索引增加/减少5。
在Skip(index)中使用该索引来跳过请求的项目。
int _index = 0;
void OnForwardButton(...)
{
_index += 5;
}
void OnBackwardButton(...)
{
_index -= 5;
}
在声明中使用:
myObservableCollectionObject.Skip(_index).Take(5);
我没有添加安全语句来检查索引并将5变为常量。
答案 1 :(得分:0)
似乎&#34;原创&#34;必须存储集合并且&#34;转到上一个/下一个&#34;命令应该实现为计算&#34;过滤&#34;收集,因为没有办法倒回&#34;过滤&#34;集合(它没有以前的项目)。
使用&#34;过滤&#34;要显示的集合。
答案 2 :(得分:0)
我的情况我准备了一些简单的扩展方法,以保护“页面”超出范围:
public static int EnsurePageNo(
this int page,
int pageSize,
int totalItems)
{
if (pageSize < 1)
throw new ArgumentException("Page size should at least 1.", "pageSize");
if (page < 1) return 1;
return page > totalItems / pageSize
? totalItems / pageSize + 1;
: page;
}
public static IEnumerable<T> Page<T>(
this IEnumerable<T> source,
int page,
int pageSize)
{
var toSkip = pageSize * page;
var take = pageSize;
return source.Skip(toSkip).Take(take);
}
public static IEnumerable<T> SafePage<T>(
this IEnumerable<T> source,
int page,
int? pageSize,
int totalItems)
{
// no paging
if (!pageSize.HasValue) return source;
if (page < 1)
throw new ArgumentException("Page number should be greater or equal 1.");
var pgSize = pageSize.Value;
page = page.EnsurePageNo(pgSize, totalItems);
return source.Page(page - 1, pgSize);
}
用法:
var totalCount = myObservableCollectionObject.Count();
var result = myObservableCollectionObject.SafePage(page, pageSize, totalCount);
对于简单的分页来说可能太过分了,但它是可重用的,我不需要记住数学表达式。