自己的CollectionView用于分页,排序和过滤

时间:2013-04-04 23:16:04

标签: wpf sorting pagination filtering collectionview

我已经实现了自己的CollectionView,将数据集合绑定到WPF中的DataGrid。

主要目标是分页,这是非常有效的。 我写了以下C#代码:

public class SchemesCollectionView : CollectionView
{
    private readonly IList<Scheme> innerList;
    private readonly int itemsPerPage;

    private int currentPage = 1;

    public SchemesCollectionView(IList<Scheme> source, int itemsPerPage)
        : base(source)
    {
        innerList = source;
        this.itemsPerPage = itemsPerPage;
    }

    public override int Count
    {
        get { return itemsPerPage; }
    }

    public int CurrentPage
    {
        get { return currentPage; }
        set
        {
            currentPage = value;
            OnPropertyChanged(new PropertyChangedEventArgs("CurrentPage"));
            OnPropertyChanged(new PropertyChangedEventArgs("FirstItemNumber"));
            OnPropertyChanged(new PropertyChangedEventArgs("LastItemNumber"));
        }
    }

    public int ItemsPerPage { get { return this.itemsPerPage; } }

    public int PageCount
    {
        get
        {
            return (this.innerList.Count() + this.itemsPerPage - 1)
                / this.itemsPerPage;
        }
    }

    public int LastItemNumber
    {
        get
        {
            var end = currentPage * itemsPerPage - 1;
            end = (end > innerList.Count()) ? innerList.Count() : end;

            return end + 1;
        }
    }

    public int StartIndex
    {
        get { return (currentPage - 1) * itemsPerPage; }
    }

    public int FirstItemNumber
    {
        get { return ((currentPage - 1) * itemsPerPage) + 1; }
    }

    public override object GetItemAt(int index)
    {
        var offset = index % (ItemsPerPage);

        var position = StartIndex + offset;

        if (position >= innerList.Count)
        {
            position = innerList.Count - 1;
        }

        return innerList[position];
    }

    public void MoveToNextPage()
    {
        if (CurrentPage < PageCount)
        {
            CurrentPage += 1;
        }
        Refresh();
    }

    public void MoveToPreviousPage()
    {
        if (CurrentPage > 1)
        {
            CurrentPage -= 1;
        }
        Refresh();
    }

    public void MoveToFirstPage()
    {
        CurrentPage = 1;
        Refresh();
    }

    public void MoveToLastPage()
    {
        CurrentPage = PageCount;
        Refresh();
    }
}

如前所述,分页效果很好。但我无法进行过滤和排序工作。当我向Filter属性添加自定义过滤器时,它会被完全忽略。与排序相同。点击它们后,我可以看到列标题上的箭头,但不同的排序不会反映在DataGrid中。

我在这里缺少什么?希望有人可以提供帮助。

2 个答案:

答案 0 :(得分:2)

如上所述,您可以从Silverlight获取代码并在WPF中使用它。

Paged Collection View in WPF

答案 1 :(得分:0)

以下是仅使用CollectionView类进行过滤和分页的解决方案。

您只需设置当前页面索引和每页最多项目即可满足您的需求。

        // obtenir la CollectionView 
        ICollectionView cvCollectionView = CollectionViewSource.GetDefaultView(this.Suivis);
        if (cvCollectionView == null)
            return;

        // filtrer ... exemple pour tests DI-2015-05105-0
        cvCollectionView.Filter = p_oObject => { return true; /* use your own filter */ };

        // page configuration
        int iMaxItemPerPage = 2;
        int iCurrentPage = 0;
        int iStartIndex = iCurrentPage * iMaxItemPerPage;

        // déterminer les objects "de la page"
        int iCurrentIndex = 0;
        HashSet<object> hsObjectsInPage = new HashSet<object>();
        foreach (object oObject in cvCollectionView)
        {
            // break if MaxItemCount is reached
            if (hsObjectsInPage.Count > iMaxItemPerPage)
                break;

            // add if StartIndex is reached
            if (iCurrentIndex >= iStartIndex)
                hsObjectsInPage.Add(oObject);

            // increment
            iCurrentIndex++;
        }

        // refilter
        cvCollectionView.Filter = p_oObject =>
        {
            return cvCollectionView.Contains(p_oObject) && hsObjectsInPage.Contains(p_oObject);
        };