2

我创建了一个包含通过 CollectionViewSource 绑定的 ListBox 的用户控件。ListBox 有 CheckBoxes 供用户进行多项选择。我希望列表与顶部的选定复选框一起排序。我希望一旦用户选择或取消选择某些东西,它就会起作用。我似乎无法通过 xaml 找到任何可以做到这一点的东西。我究竟做错了什么?

在我的xml中

<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">
4

2 回答 2

1

我也遇到了同样的问题,最后我发现问题出在数据源上,我怀疑你的问题和我的一样。

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

但是,如果您必须使用自定义集合类而不是ObservableCollection,请确保该类实现IList,而不仅仅是泛型IList<>。如果您不这样做,则很可能会禁用实时排序。并且为了确保所有其他领域的顺利进行,我强烈建议您也实施INotifyCollectionChangedINotifyPropertyChanged为之。

无论你使用哪个集合类,其中包含的项目仍然要实现INotifyPropertyChanged. 没有其他方法可以解决它。

于 2018-07-11T22:58:00.610 回答
0

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

于 2013-09-06T15:40:43.723 回答