WPF中CollectionViewSource为DataGrid排序完全失效问题求助
问题分析与解决方案
核心问题根源
你遇到的排序失效、ListCollectionView无SortDescriptions的问题,本质是DataGrid的ItemsSource绑定写错了——你直接绑定到了CollectionViewSource实例本身,而非它的View属性。
WPF的CollectionViewSource是视图的"工厂",它本身不是视图对象,而是负责生成和管理ICollectionView(这里就是ListCollectionView)。当你把DataGrid的ItemsSource直接绑到CollectionViewSource时,WPF会绕过你定义的排序规则,自动为原始的ObservableCollection创建一个全新的默认ListCollectionView,这就是为什么你看到的视图没有任何排序描述。
修复步骤
只需要修改DataGrid的绑定路径,指向CollectionViewSource的View属性即可:
<DataGrid ItemsSource="{Binding Source={StaticResource cvs}, Path=View}"/>
为什么替换集合后排序依然有效?
当你整体替换ObservableCollection实例时,只要你的ViewModel正确触发了PropertyChanged事件(从你的SetAndRaiseIfChanged方法来看应该没问题),CollectionViewSource会自动感知到Source的变化,创建新的ListCollectionView并自动应用你在XAML中定义的SortDescriptions,DataGrid也会自动更新为这个已排序的视图。
额外检查点
如果修复后还是有问题,可以排查以下两点:
- 确认
Item类的Time属性是可排序的有效类型(你用的DateTime完全没问题); - 确认ViewModel的
Items属性在替换时,正确触发了INotifyPropertyChanged.PropertyChanged事件(比如你的SetAndRaiseIfChanged方法是否正确实现了这个逻辑)。
内容的提问来源于stack exchange,提问作者Bogey
相关产品推荐
相关产品推荐

