2013-04-04 32 views
2

我已經實現了自己的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中。

我在這裏錯過了什麼?希望有人能幫忙。

回答

2

如上所述,您可以從Silverlight獲取代碼並在WPF中使用該代碼。

Paged Collection View in WPF

+0

謝謝。來源看起來不錯。 我已經將它複製到我的項目中,但是每次我想使用分頁(例如向前一頁)時,我都會收到「集合已被修改;枚舉操作無法執行」。錯誤。 不知道爲什麼以及如何解決這個問題。 – FDeitelhoff 2013-04-05 10:06:13

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); 
     };