我的视图模型中有ObservableCollection
,我的视图中有CollectionViewSource
和ListBox
。
ListBox
绑定到CollectionViewSource
。 CollectionViewSource
绑定到ObservableCollection
,对项目进行排序并将其排列成组。我通过IsLiveGroupingRequested
上的IsLiveSortingRequested
和CollectionViewSource
属性启用了实时排序和实时分组,因此每当基础视图模型对象发生更改时,它们都会重新排序并重新分组到ListBox
。一切正常。
问题与选择有关。如果我在ListBox
中选择了一个项目,然后由于视图模型对象以某种方式被更改而重新分组,则该项目在移动到新组时将被取消选择。
如何重新分组所选项目时如何保留选择?
这是一个简单的修剪XAML示例,显示了问题。如果AllItems中某个对象的Category属性发生更改,则由于实时整形,该项目将正确重新分组。但是,如果选择了该项目,它将被取消选中。
<Grid>
<Grid.Resources>
<CollectionViewSource x:Key="MyItems" Source="{Binding AllItems}" IsLiveGroupingRequested="True" IsLiveSortingRequested="True">
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="Category" />
<componentModel:SortDescription PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Category" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Grid.Resources>
<ListBox ItemsSource="{Binding Source={StaticResource MyItems}}">
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
</Grid>
我在互联网上寻找解决方案,但根本找不到任何东西。我找到this thread,但没有发布解决方案。
我正拉着我的头发试图让这个工作。我非常感谢任何帮助!
答案 0 :(得分:2)
目前没有简单的解决方案。
我可以看到两种解决方案:
1)用户手动停止实时更新。 允许使用跳转数据很容易出错。
示例:从MS中暂停WCF日志查看器中的按钮。
2)在开始更新数据之前,请记住所选项目。更新完成后只返回选择。
示例:How To Prevent WPF DataGrid From De-Selecting SelectedItem When Items Updated?