WPF — поддерживать стиль группы в ListView

У меня есть простой ListView, который извлекает данные из ObservableCollection, и я использую CollectionViewSource для установки GroupPropertyDescription, чтобы мои строки выглядели сгруппированными. Я использовал следующий стиль, чтобы использовать расширитель для каждой группы:

<Style TargetType="{x:Type GroupItem}" x:Key="listViewGroupStyle">
    <Setter Property="Margin" Value="0 0 0 5" />
    <Setter Property="Template" >
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Expander IsExpanded="False" BorderBrush="{Binding Name, Converter={StaticResource statusForegroundConverter}}" BorderThickness="2" Margin="1">
                    <Expander.Header>
                        <Border BorderThickness="3" BorderBrush="{Binding Name, Converter={StaticResource statusBackgroundConverter}}" CornerRadius="6">
                            <DockPanel TextBlock.FontWeight="Bold" TextBlock.Foreground="{Binding Name, Converter={StaticResource statusForegroundConverter}}">
                                <TextBlock Text="{Binding Name, Converter={StaticResource statusStringConverter}}" Margin="5 2 2 2" />
                                <TextBlock Text=" - " Margin="2" />
                                <TextBlock Text="{Binding Path=ItemCount}" Margin="0 2 5 2"/>
                            </DockPanel>
                        </Border>
                    </Expander.Header>
                    <Expander.Content>
                        <ItemsPresenter />
                    </Expander.Content>
                </Expander>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Моя проблема заключается в том, что моя коллекция часто обновляется во время выполнения, и каждый раз, когда это происходит, все группы сворачиваются независимо от того, были ли у меня какие-то открытые.

Есть ли способ сохранить внешний вид ListView после того, как моя коллекция была переназначена?


person Dhiren Vekaria    schedule 03.08.2010    source источник


Ответы (1)


Я нашел решение, с большинством деталей здесь:

http://social.msdn.microsoft.com/Forums/en/wpf/thread/f022425b-f685-4a7a-91df-828103871ebc

Суть в том, что когда ItemsSource переназначается, он делает связанный элемент управления недействительным, вызывая его перерисовку. Однако, поскольку я использовал ObservableCollection, гораздо проще накапливать новые данные во временном списке и при необходимости добавлять или удалять объекты из исходного списка:

ObservableCollection<xxx> tempBuilds = new ObservableCollection<xxx>();

IEnumerable<xxx> addRange = tempBuilds.Except(_filteredBuilds);
IEnumerable<xxx> removeRange = _filteredBuilds.Except(tempBuilds);

addRange.ToList().ForEach(bm => _filteredBuilds.Add(bm));
removeRange.ToList().ForEach(bm => _filteredBuilds.Remove(bm));
person Dhiren Vekaria    schedule 16.08.2010