2013-02-26 92 views
5

我有一个WPF Datagrid与自定义排序实施,它工作正常。我需要将集合中的一些记录锁定到顶部和底部(顶部锁定和底部锁定)。所以当一个特定的记录被顶部锁定时,它应该是集合中的第一条记录,而不管所选列的值如何(即我不想对那些顶部锁定和底部锁定的行进行排序)。这是我的自定义排序方法。WPF DataGrid自定义排序锁定了一些记录

private void PerformLineCustomSort(DataGridColumn column) 
     { 
      ListSortDirection direction = (column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending; 
      column.SortDirection = direction; 
      ListCollectionView listCollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(Lines); 

      LineSorter lineSort = new LineSorter(direction, column); 
      listCollectionView.CustomSort = lineSort; 

     } 

其中LineSorter是我的自定义分类器类的IComparer实施。这工作正常。现在我想将顶部锁和底部锁应用于ListCollectionView。我已经尝试了以上代码,但它没有任何更改(即,列表仅基于自定义排序列进行排序)。

listCollectionView.SortDescriptions.Add(new SortDescription("TopLock", ListSortDirection.Descending)); 
listCollectionView.SortDescriptions.Add(new SortDescription("BotLock", ListSortDirection.Ascending)); 

有没有办法做这种情况下,还是我需要手动删除,然后添加锁定的记录。请建议..

+1

你可以创建三个不同的集合和联合它。一个集合将有顶级锁,第二个有底部锁,第三个集合将有所有元素休息。 – 2013-02-26 08:44:33

+3

将您的'LineSorter.Compare()'实现更改为始终返回顶部锁定项目的数量小于其他项目,并将底部锁定项目的数量大于其他项目。我假设有一个原因,你不能这样做,但? – 2013-02-26 08:59:47

回答

0

好吧。你可以通过你的代码来做到这一点。

Let'a承担

The page size   = 10 

Current page   = 2 

Collection name  = myItems 

First Item to display = initialItem 

Last Item to display = lastItem 

步骤:

  • 分类收集
  • 从集合 以9〜16个项目(8个项目)(因为你是在第二页)

初始项目数= 8×(当前页号-1)+ 1的最后一个项目

数= 8×当前页号

所以:

初始项目数= 8 x(2 - 1)+ 1 = 9

最后一件商品编号= 8 x 2 = 16

(现在你有8个项目子集合被排序)

  • 添加intialItem的子集的首要

myItems.Insert(0,initialItem);

  • 添加lastItem到副收集

    myItems.Insert(9,lastItem)的端部;