我创建了一个包含通过 CollectionViewSource 绑定(bind)的 ListBox 的用户控件。列表框有复选框供用户进行多项选择。我希望列表按照顶部选定的复选框进行排序。我希望一旦用户选择或取消选择某些内容,它就能起作用。我似乎找不到任何通过 xaml 执行此操作的东西。我做错了什么?
在我的 xaml 中
<CollectionViewSource x:Key="SortedItems"
Source="{Binding Items, ElementName=Selector}"
IsLiveSortingRequested="True">
<CollectionViewSource.LiveSortingProperties>
<System:String>IsSelected</System:String>
</CollectionViewSource.LiveSortingProperties>
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="IsSelected"
Direction="Descending" />
<scm:SortDescription PropertyName="CodeDescriptionText" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
和我的列表框
<ListBox x:Name="ItemsControl"
SelectionMode="Multiple"
ItemsSource="{Binding Source={StaticResource SortedItems}}"
ItemTemplate="{Binding ItemTemplate, ElementName=Selector}"
ItemContainerStyle="{StaticResource ListBoxItemStyle}"
Grid.Row="1"
Grid.ColumnSpan="3">
最佳答案
我也遇到了同样的问题,最后发现问题出在数据源上,我怀疑你的问题和我的一样。
同时CollectionViewSource
可以使用多种不同类型的数据源,但并非所有数据源都可以使用实时排序。为了确保一切顺利进行,最好使用 ObservableCollection
实现 INotifyPropertyChanged
的项目数量为数据源。
但是如果你必须使用自定义集合类而不是ObservableCollection
,然后确保该类实现 IList
,而不仅仅是通用的 IList<>
。如果不这样做,实时排序很可能会被禁用。为了确保所有其他领域顺利工作,我强烈建议您也实现 INotifyCollectionChanged
和INotifyPropertyChanged
也为了它。
无论您使用哪个集合类,其中包含的项目仍然必须实现 INotifyPropertyChanged
。没有其他方法可以解决这个问题。
关于c# - CollectionViewSource 实时排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18660812/