与ObservableCollection中的Skip方法相反

时间:2015-01-16 09:42:43

标签: c# wpf observablecollection skip

我正在使用ObservableCollection方法Skip在用户按下n Next时显示列表中的下一个Button项。< / p>

是否有方法或简单的方法来做相反的事情?那是在列表中倒退了吗?

这就是我现在正在使用的。

myObservableCollectionObject.Skip(5).Take(5);

如果我刚看到6 - 10,这会显示项1 - 5。当按下另一个Button时,我想显示之前的5个项目(1 - 5)

3 个答案:

答案 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;集合(它没有以前的项目)。

使用&#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);

对于简单的分页来说可能太过分了,但它是可重用的,我不需要记住数学表达式。