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文件

读取自定义Datagrid的每个单元格数据 - WPF C#

WPF Datagrid对具有空元素的列进行排序

wpf 怎么给datagrid 右键菜单加多个选项?

wpf DataGrid自定义相关问题

WPF自定义控件与样式-列表控件DataGrid与ListView自定义样式