2013-04-04 33 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); 
     };