我创建了一个包含ListBox的用户控件,该ListBox通过CollectionViewSource绑定。 ListBox具有CheckBoxes,供用户进行多项选择。我希望列表与顶部选定的CheckBoxes一起排序。我希望一旦用户选择或取消选择某些内容,就可以使用它。我似乎找不到任何通过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">
答案 0 :(得分:0)
在ItemTemplate
中,您是否将bool
属性绑定到Checkbox.IsChecked
属性?如果你是,那么你应该能够将该属性设置为SortDescription.PropertyName
属性,因为它似乎你正在做什么。如果没有,那么 就是你需要做的。
答案 1 :(得分:0)
我也遇到了同样的问题,最终我发现问题出在数据源上,我怀疑您的问题与我的问题相同。
尽管CollectionViewSource
可以使用许多不同类型的数据源,但并非所有数据源都可以使用实时排序。为了确保一切顺利进行,最好使用ObservableCollection
项,它们为数据源实现INotifyPropertyChanged
。
但是,如果您必须使用自定义集合类而不是ObservableCollection
,请确保该类实现IList
,而不仅仅是通用IList<>
。如果您不这样做,则很可能会禁用实时排序。为了确保其他所有区域都能正常工作,我强烈建议您也同时实施INotifyCollectionChanged
和INotifyPropertyChanged
。
无论您使用哪个收集类,其中包含的项目仍必须实现INotifyPropertyChanged
。没有其他解决办法。