【发布时间】: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