CollectionViewSource实时排序无效

时间:2013-09-06 15:00:40

标签: c# wpf xaml collectionviewsource

我创建了一个包含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">

2 个答案:

答案 0 :(得分:0)

ItemTemplate中,您是否将bool属性绑定到Checkbox.IsChecked属性?如果你是,那么你应该能够将该属性设置为SortDescription.PropertyName属性,因为它似乎你正在做什么。如果没有,那么 就是你需要做的。

答案 1 :(得分:0)

我也遇到了同样的问题,最终我发现问题出在数据源上,我怀疑您的问题与我的问题相同。

尽管CollectionViewSource可以使用许多不同类型的数据源,但并非所有数据源都可以使用实时排序。为了确保一切顺利进行,最好使用ObservableCollection项,它们为数据源实现INotifyPropertyChanged

但是,如果您必须使用自定义集合类而不是ObservableCollection,请确保该类实现IList,而不仅仅是通用IList<>。如果您不这样做,则很可能会禁用实时排序。为了确保其他所有区域都能正常工作,我强烈建议您也同时实施INotifyCollectionChangedINotifyPropertyChanged

无论您使用哪个收集类,其中包含的项目仍必须实现INotifyPropertyChanged。没有其他解决办法。