WPF DataGrid 自定义排序,其中一些记录被锁定
Posted
技术标签:
【中文标题】WPF DataGrid 自定义排序,其中一些记录被锁定【英文标题】:WPF DataGrid custom sorting with some records locked 【发布时间】:2013-02-11 14:29:41 【问题描述】:我有一个实现了自定义排序的 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 应用 Top lock 和 Bottom lock。我已经用上面的代码尝试了下面的代码,但它没有任何变化(即列表仅基于自定义排序列进行排序)。
listCollectionView.SortDescriptions.Add(new SortDescription("TopLock", ListSortDirection.Descending));
listCollectionView.SortDescriptions.Add(new SortDescription("BotLock", ListSortDirection.Ascending));
这种情况有什么办法吗,还是我需要手动删除然后添加锁定的记录。请建议..
【问题讨论】:
您可以创建三个不同的集合并将其合并。一个集合将具有顶部锁定,第二个具有底部锁定,第三个集合将具有其余所有元素。 更改您的LineSorter.Compare()
实现以始终将顶部锁定的项目返回为小于其他项目,并将底部锁定的项目返回为大于其他项目。我假设你不能这样做是有原因的?
【参考方案1】:
嗯。您可以通过您的代码实现这一点。
假设
The page size = 10 Current page = 2 Collection name = myItems First Item to display = initialItem Last Item to display = lastItem
步骤:
对集合进行排序 从收藏中取出 9 到 16 件(8 件) (因为你在第二页)初始项目编号 = 8 x(当前页码 -1)+ 1 最后一项
数字 = 8 x 当前页码
所以:
初始项目编号 = 8 x (2 - 1) + 1 = 9
最后一个项目编号 = 8 x 2 = 16
(现在您有一个已排序的 8 个项目的子集合)
将 intialItem 添加到子集合的顶部myItems.Insert(0, initialItem);
将lastItem添加到子集合的末尾
myItems.Insert(9, lastItem);
【讨论】:
以上是关于WPF DataGrid 自定义排序,其中一些记录被锁定的主要内容,如果未能解决你的问题,请参考以下文章
将wpf datagrid导出为自定义Excel CSV文件