C# 具有实时成型/分组的列表框-当项目重新分组时如何保持选择?

C# 具有实时成型/分组的列表框-当项目重新分组时如何保持选择?,c#,.net,wpf,wpf-4.5,C#,.net,Wpf,Wpf 4.5,我的视图模型中有一个observateCollection,视图中有一个CollectionViewSource和ListBox ListBox绑定到CollectionViewSource。CollectionViewSource绑定到ObservableCollection,对项目进行排序并将其分组。我通过CollectionViewSource上的IsLiveGroupingRequested和IsLiveSortingRequested属性启用了实时排序和实时分组,因此每当基础视图模型对

我的视图模型中有一个
observateCollection
,视图中有一个
CollectionViewSource
ListBox

ListBox
绑定到
CollectionViewSource
CollectionViewSource
绑定到
ObservableCollection
,对项目进行排序并将其分组。我通过
CollectionViewSource
上的
IsLiveGroupingRequested
IsLiveSortingRequested
属性启用了实时排序和实时分组,因此每当基础视图模型对象更改时,它们都会在
列表框中重新排序和分组。这一切都很好

这个问题与选择有关。如果我在
列表框
中选择一个项目,然后由于视图模型对象以某种方式发生更改而对其重新分组,则该项目在移动到新组时将取消选择

当所选项目重新分组时,如何保留所选内容?

下面是一个简单的精简XAML示例,显示了这个问题。如果AllItems中某个对象的“类别”属性发生更改,则该项目将正确地重新分组,这要归功于live shaping。但是,如果选择了该项目,它将变为未选择

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

目前没有简单的解决方案

我可以看到两种解决方案:

1) 按用户手动停止实时更新。 允许使用跳转数据时容易出错

示例:来自MS的WCF日志查看器中的暂停按钮

2) 在开始更新数据之前,请记住所选项目。更新完成后,只需返回所选内容

例如: