2

データのコレクションを WPF の DataGrid にバインドするために、独自の CollectionView を実装しました。

主な目標はページネーションで、これは非常にうまく機能しています。次の 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 内に反映されません。

ここで何が欠けていますか?誰かが助けてくれることを願っています。

4

2 に答える 2

2

これで述べたように、Silverlight からコードを取得して、それを WPF で使用できます。

WPF のページ コレクション ビュー

于 2013-04-05T03:58:24.763 に答える