我已經實現了自己的CollectionView,以將數據集合綁定到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中。
我在這裏錯過了什麼?希望有人能幫忙。
謝謝。來源看起來不錯。 我已經將它複製到我的項目中,但是每次我想使用分頁(例如向前一頁)時,我都會收到「集合已被修改;枚舉操作無法執行」。錯誤。 不知道爲什麼以及如何解決這個問題。 – FDeitelhoff 2013-04-05 10:06:13