使用ObservableCollection上的CollectionViewSource进行列表框实时排序

时间:2014-05-05 19:42:24

标签: c# wpf xaml sorting listbox

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

在我的viewmodel中,我有以下公共属性:

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

设备是来自实体框架的自动生成的类,其中包含名为“描述”的公共字符串属性。这是我的排序目标。

我的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启用实时ListBox排序?

1 个答案:

答案 0 :(得分:8)

您希望将ItemsSource绑定到CollectionViewSource,而不是绑定到底层集合:

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

将CollectionViewSource放在页面上方的某个资源字典中。将其源代码绑定到底层集合(&#34; EquipmentList&#34;):

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