WPF - поддерживать стиль группы в ListView - PullRequest
0 голосов
/ 03 августа 2010

У меня есть простой 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 после переназначения моей коллекции?

1 Ответ

0 голосов
/ 16 августа 2010

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

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));
...