You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF ListCollectionView自定义排序:如何关闭实时排序并保留当前顺序

解决ListCollectionView关闭排序并保持当前顺序的问题

嘿,我来帮你理清这里的误区,然后给你一个简单的解决方案。

首先,你对IsLiveSorting的理解确实有点偏差:这个属性的作用是控制当数据项的属性发生变化时,是否自动触发排序刷新,它需要配合LiveSortingProperties指定哪些属性变化会触发实时排序。但只要CustomSort还存在,ListCollectionView的排序逻辑就始终会基于这个比较器——哪怕IsLiveSorting=false,当某些操作(比如DataGrid编辑完成后触发的视图刷新)导致排序重新执行时,还是会用你的ConnectionViewModelComparer来重新排序,所以行还是会变动。

而直接把CustomSort设为null的问题在于,这会让CollectionView回到数据源的原始未排序顺序,而不是你当前看到的排序后的顺序,这显然不是你想要的。

简单的解决方案:用“无操作比较器”保留当前顺序

你可以创建一个始终返回0的比较器,当需要关闭排序时,把CustomSort替换成这个比较器。这样排序逻辑不会改变现有项的顺序,同时也能避免后续自动排序:

// 定义一个无操作比较器
public class NoOpComparer : IComparer
{
    public int Compare(object x, object y)
    {
        // 返回0表示两个项相等,排序时会保持原有顺序
        return 0;
    }
}

然后修改你的StopSorting方法:

public void StopSorting() {
    if (CV is ListCollectionView view) {
        view.IsLiveSorting = false;
        // 替换成无操作比较器,保留当前顺序
        view.CustomSort = new NoOpComparer();
    }
}

如果之后需要恢复原来的排序,只要把CustomSort重新设回new ConnectionViewModelComparer()(或者你可以提前保存这个实例,避免重复创建)即可。

额外说明

  • 这个方法的核心是利用ListCollectionView的稳定排序特性:当比较器返回0时,项的相对顺序会保持不变,这样就能完美保留你关闭排序前的当前顺序。
  • 如果你担心多次创建NoOpComparer,可以把它做成单例模式,节省内存。

内容的提问来源于stack exchange,提问作者J.Thor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:26:47