ObservableCollection本身是没有排序Sort功能的,不过我们可以通过冒泡排序来实现,以下是扩展功能:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public static void Sort<T>(this ObservableCollection<T> collection, IComparer<T> comparer) { if (collection == null || collection.Count == 0) return; int i, j; T index; for (i = 1; i < collection.Count; i++) { index = collection[i]; j = i; while ((j > 0) && (comparer.Compare(collection[j - 1], index) == 1)) { collection[j] = collection[j - 1]; j = j - 1; } collection[j] = index; } }
这个方法在win7上运行没有问题,排序功能可以正常运行
在win10上排序能正常运行,但是如果是将ObservableCollection绑定到树结构上时,执行排序操作会对展开的树进行收起操作。
就是一个树在展开的时候子节点进行排序,当排序完成后,这棵树会自动收起,不知道什么原因,完全是控件自动处理的。
后面想了一下是不是扩展的排序的方法造成了影响,后面索性就换了一个方法,直接使用ObservableCollection自带的move功能,如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public static void Sort<T>(this ObservableCollection<T> collection, IComparer<T> comparer) { if (collection == null || collection.Count <= 1) return; var lst = collection.ToList(); lst.Sort(comparer); var count = collection.Count; for (int m = 0; m < count; m++) { var dex = collection.IndexOf(lst[m]); if (dex == m) continue; collection.Move(dex, m); } }
使用新的方法后,排序的时候树就不会自动收缩了。
至于为什么之前的排序方法不行,还需要以后慢慢研究。