自己的CollectionView寻呼,排序和过滤(Own CollectionView for p

2019-08-19 16:21发布

我实现了我自己的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();
    }
}

如前所述,分页工作得很好。 但我不能得到过滤和排序工作。 当我添加自定义过滤器,过滤器属性,它被完全忽略。 与排序一样。 我可以看到列标题中的箭头后,我点击他们,但不同的排序不是在DataGrid中反映出来。

什么我在这里失踪? 希望有人能提供帮助。

Answer 1:

正如在此提到的,你可以采取的Silverlight代码和使用,在WPF。

分页集合视图中的WPF



Answer 2:

下面是过滤和寻呼只使用的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);
        };


文章来源: Own CollectionView for paging, sorting and filtering