c# - CollectionViewSource 实时排序不起作用

标签 c# wpf xaml collectionviewsource

我创建了一个包含通过 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<> 。如果不这样做,实时排序很可能会被禁用。为了确保所有其他领域顺利工作,我强烈建议您也实现 INotifyCollectionChangedINotifyPropertyChanged也为了它。

无论您使用哪个集合类,其中包含的项目仍然必须实现 INotifyPropertyChanged 。没有其他方法可以解决这个问题。

关于c# - CollectionViewSource 实时排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18660812/

相关文章:

c# - 在没有注册表的情况下加载 IFilter

c# - 像 Google Chrome 选项卡一样的选项卡控件?

c# - 如何在 C# 中创建一个完美的 Singleton 类?

javascript - 如何在前端和后端验证必填字段

wpf - bool 动画锁定属性

visual-studio - "Class" namespace 中不存在 "http://schemas.microsoft.com/winfx/2009/xaml"属性

c# - 为什么我的 ItemsControls 中的项目不水平布局?

c# - x 的设置值 :Uid programmatically

c# - 计时器内的秒表在 C# 中不起作用

wpf - 如何使 WPF 文本框使用密码字符?