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
相关产品推荐
相关产品推荐

