【问题标题】:Listbox live sort using CollectionViewSource on ObservableCollection使用 ObservableCollection 上的 CollectionViewSource 进行列表框实时排序
【发布时间】:2014-06-22 05:26:14
【问题描述】:

我想启用绑定到 ObservableCollection 的 ListBox 项目的实时排序;我还想通过我的 XAML 标记(如果可能)专门启用实时排序。就目前而言,列表在应用程序启动时正确排序,但是当新项目添加到 ObservableCollection 时,项目只是附加(未排序)到 ListBox。

在我的视图模型中,我有以下公共属性:

public ObservableCollection<Equipment> EquipmentList { get; set; }

Equipment 是 Entity Framework 自动生成的类,它包含一个名为“Description”的公共字符串属性。这是我的排序目标。

我的 XAML 具有以下用于启用实时排序的 DataTemplate:

<DataTemplate x:Key="EquipmentDescriptionTemplate" 
                      DataType="{x:Type e:Equipment}">
    <DataTemplate.Resources>
        <CollectionViewSource x:Key="SortedEquipmentList" 
                              Source="{Binding Path=Description, 
                                  Mode=OneWay, 
                                  UpdateSourceTrigger=PropertyChanged}" 
                                  IsLiveSortingRequested="True">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Description" 
                                     Direction="Ascending"/>
            </CollectionViewSource.SortDescriptions>
            <CollectionViewSource.LiveSortingProperties>
                <clr:String>Description</clr:String>
            </CollectionViewSource.LiveSortingProperties>
        </CollectionViewSource>
    </DataTemplate.Resources>
    <TextBlock Text="{Binding Path=Description}" />
</DataTemplate>

最后是 XAML ListBox 项:

<ListBox x:Name="EquipmentList" 
     ItemsSource="{Binding Path=EquipmentList, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" 
     ItemTemplate="{StaticResource EquipmentDescriptionTemplate}" 
     IsSynchronizedWithCurrentItem="True" 
     SelectedItem="{Binding EquipmentSelection, UpdateSourceTrigger=PropertyChanged}" 
     Grid.ColumnSpan="2" Grid.Row="1" Margin="5,5,5,5"/>

在我拼命尝试让实时排序工作时,我添加了许多额外的属性(如有疑问,请疯狂猜测!)。我把它们留在里面,这样人们就可以看到我的尝试并窃笑。

如何通过 XAML 启用实时列表框排序?

【问题讨论】:

    标签: c# wpf xaml sorting listbox


    【解决方案1】:

    您需要将 ItemsSource 绑定到 CollectionViewSource,而不是基础集合:

    <ListBox x:Name="EquipmentList" 
             ItemsSource="{StaticResource SortedEquipmentList}" 
             ...
             />
    

    将 CollectionViewSource 放在页面资源字典的上方某处。将其源绑定到底层集合(“EquipmentList”):

    <CollectionViewSource x:Key="SortedEquipmentList" 
                          Source="{Binding EquipmentList.View}" 
                          IsLiveSortingRequested="True">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="Description" Direction="Ascending"/>
        </CollectionViewSource.SortDescriptions>
        <CollectionViewSource.LiveSortingProperties>
            <clr:String>Description</clr:String>
        </CollectionViewSource.LiveSortingProperties>
    </CollectionViewSource>
    

    【讨论】:

    • 执行此操作时,我收到以下设计时错误:“无法将 CollectionViewSource 类型的对象应用于需要 IEnumerable 类型的属性。”我还需要做些什么来将 ItemsSource 绑定到 CollectionViewSource 项吗?
    • @StardewJellyfeather 对不起,我想你只需要EquipmentList.View
    • 我想我明白了。 ItemsSource 需要进行一些小的调整(我可能会更早发现这一点,但我是 n00b):ItemsSource="{Binding Source={StaticResource SortedEquipmentList}}"。 (顺便说一句,既然你编辑了我的原始帖子,你是怎么做到的?如果我一开始就做对了,我可能会为人们节省很多精力。:)
    • @StardewJellyfeather 我是如何编辑帖子的?您应该会在下方看到一个“编辑”按钮——您始终可以编辑自己的帖子,但如果您在某个代表之下,那么对其他人帖子的编辑会进入审核队列。
    • 抱歉,我指的是 XAML 标记本身。当我并排查看时,我的是纯文本,而您的则具有所有正确的颜色。我尝试使用 ` 标记在原始帖子中指定代码,但没有成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多