Динамическая сортировка CollectionViewSource не работает

Я создал пользовательский элемент управления, содержащий ListBox, который связан через CollectionViewSource. ListBox имеет 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">

person UCFLaura    schedule 06.09.2013    source источник
comment
Где это ? Источник={Элементы привязки, ElementName=Селектор}   -  person 123 456 789 0    schedule 06.09.2013
comment
Items - это коллекция в моей ViewModel   -  person UCFLaura    schedule 06.09.2013
comment
Если вы пропустите коллекцию LiveSortingProperties (но по-прежнему установите для IsLiveSortingRequested значение true), по умолчанию будут использоваться свойства из SortDescriptions.   -  person Govert    schedule 13.03.2014


Ответы (2)


У меня также была такая же проблема, и в конце концов я обнаружил, что проблема связана с источником данных, и я подозреваю, что ваша проблема такая же, как у меня.

Хотя CollectionViewSource может работать с различными типами источников данных, не все из них будут работать с динамической сортировкой. Чтобы обеспечить бесперебойную работу, лучше всего использовать ObservableCollection элементов, реализующих INotifyPropertyChanged для источника данных.

Но если вам нужно использовать пользовательский класс коллекции вместо ObservableCollection, убедитесь, что класс реализует IList, а не только общий IList<>. Если вы этого не сделаете, сортировка в реальном времени, скорее всего, будет отключена. И чтобы обеспечить бесперебойную работу всех остальных областей, я настоятельно рекомендую вам также реализовать для нее INotifyCollectionChanged и INotifyPropertyChanged.

Независимо от того, какой класс коллекции вы используете, элементы, содержащиеся в нем, все равно должны реализовывать INotifyPropertyChanged. Других обходных путей нет.

person SF Lee    schedule 11.07.2018
comment
Первое место, в котором упоминается перечисление с возможностью сортировки в реальном времени, должно реализовать IList.... Я бы хотел, чтобы документы сказали мне, что :( - person user3797758; 05.07.2021

Привязываете ли вы свойства bool к свойствам Checkbox.IsChecked в своем ItemTemplate? Если да, то вы должны установить это свойство в качестве свойства SortDescription.PropertyName, поскольку кажется, что вы делаете. Если нет, то это нужно сделать.

person Sheridan    schedule 06.09.2013
comment
да, мой Checkbox.IsChecked ограничен свойством IsSelected. - person UCFLaura; 06.09.2013