具有实时整形/分组功能的列表框-重新组合项目时如何保持选择?

问题描述 投票:7回答:1

我的视图模型中有ObservableCollection,而我的视图中有CollectionViewSourceListBox

ListBox绑定到CollectionViewSourceCollectionViewSource绑定到ObservableCollection,对项目进行排序并将它们分组。我通过IsLiveGroupingRequested上的IsLiveSortingRequestedCollectionViewSource属性启用了实时排序和实时分组,因此,只要基础视图模型对象发生更改,它们就会在ListBox中重新排序和重新分组。这一切都很好。

问题与选择有关。如果我在ListBox中选择了一个项目,然后由于视图模型对象以某种方式更改而将其重新分组,则当该项目移至新组时将为un-selected

重新组合所选项目时如何保留选择?

这里是显示问题的简单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>
c# .net wpf wpf-4.5
1个回答
2
投票

当前没有简单的解决方案。

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

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

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

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

示例:How To Prevent WPF DataGrid From De-Selecting SelectedItem When Items Updated?

© www.soinside.com 2019 - 2024. All rights reserved.