C# 在ObservableCollection上使用CollectionViewSource进行列表框实时排序
我希望能够对绑定到ObservableCollection的列表框项目进行实时排序;我还想通过我的XAML标记(如果可能的话)专门启用实时排序。目前情况下,列表在应用程序启动时正确排序,但当新项目添加到ObservableCollection时,只需将项目追加(未排序)到列表框中 在我的viewmodel中,我具有以下公共属性:C# 在ObservableCollection上使用CollectionViewSource进行列表框实时排序,c#,wpf,xaml,sorting,listbox,C#,Wpf,Xaml,Sorting,Listbox,我希望能够对绑定到ObservableCollection的列表框项目进行实时排序;我还想通过我的XAML标记(如果可能的话)专门启用实时排序。目前情况下,列表在应用程序启动时正确排序,但当新项目添加到ObservableCollection时,只需将项目追加(未排序)到列表框中 在我的viewmodel中,我具有以下公共属性: public ObservableCollection<Equipment> EquipmentList { get; set; } publicobse
public ObservableCollection<Equipment> EquipmentList { get; set; }
publicobservableCollection设备列表{get;set;}
设备是从实体框架自动生成的类,它包含一个名为“Description”的公共字符串属性。这是我的分类目标
My XAML具有以下数据模板,用于启用实时排序:
<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 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启用实时列表框排序?您需要将ItemsSource绑定到CollectionViewSource,而不是基础集合:
<ListBox x:Name="EquipmentList"
ItemsSource="{StaticResource SortedEquipmentList}"
...
/>
将CollectionViewSource放在页面的资源字典中上方的某个位置。将其源绑定到基础集合(“设备列表”):
描述
执行此操作时,会出现以下设计时错误:“CollectionViewSource类型的对象无法应用于需要IEnumerable类型的属性。”是否需要执行其他操作才能将ItemsSource绑定到CollectionViewSource项目?@StardewSource抱歉,我想你只需要设备列表。查看。我想我知道了。ItemsSource需要一些小的调整(我可能早就知道了,但我是n00b):ItemsSource=“{Binding Source={StaticResource SortedEquipmentList}}”
。(顺便说一句,既然你编辑了我的原创文章,你是怎么做到的?如果我一开始就做对的话,我可能会节省很多人的精力。:@StardewJellyfeather我是怎么编辑这篇文章的?你应该在下面看到一个“编辑”按钮——你可以随时编辑自己的帖子,但是如果你在某个代表下,那么对其他人帖子的编辑将通过审查队列进行。对不起,我指的是XAML标记本身。当我并排看时,我的是纯文本,而你的是所有正确的颜色。我试图在原始帖子中使用`标记指定代码,但没有成功。
<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>