我想启用绑定到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排序?
答案 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>