Заголовки группы ListView, показывающие несколько раз - PullRequest
0 голосов
/ 30 января 2019

У меня есть ListView с группами и заголовками групп, которые я написал на основе определенного WPF-руководства .

Это работает правильно, но если я закрою окно, оно открывается и снова открываетсяэто путем воссоздания его (создания нового экземпляра), тогда все заголовки дублируются.Т.е. вместо того, чтобы иметь «Мой Заголовок» и элементы под ним, у меня есть «Мой Заголовок», другой «Мой Заголовок» под ним, и элементы находятся под этим.Повторное открытие в этот момент добавляет третий заголовок.Если я переключаюсь на другой источник предметов, там происходит то же самое, и кажется, что он помнит, сколько повторений имеет каждый источник.

Обратите внимание, что я абсолютно не изменяю содержимое коллекции источников в любой точке,Сериализация его на разных этапах дает один и тот же файл.Чтобы быть с, заголовки создаются только из строкового значения в данных;Я даже не знаю, как это может вызвать какую-либо рекурсию, но все же ясно, что это так.

Если вместо того, чтобы воссоздать окно, я повторно использую его и обновлю привязку при его отображении, эта проблема больше не возникает, а наоборотпри открытии окна с другим источником элементов теперь отображаются элементы без групповых заголовков.

Я пытался найти любую подобную проблему, но безрезультатно, и я новичок в WPF, поэтому я еще неразбираюсь в его работе.

Вот скриншоты окна в обоих состояниях, вместе с визуальным деревом и заголовками в нем:

First time opening the window, only one header

Second time opening the window, duplicated header

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

Вот код XAML для ListView:

<ListView
    x:Name="lvComponents" Grid.Row="1"
    ItemsSource="{Binding ScriptComponents}"
    SelectionChanged="LvComponents_SelectionChanged"
    lvl:ListViewLayoutManager.Enabled ="True"
    IsSynchronizedWithCurrentItem="True"
    externals:GridViewSort.AutoSort="True"
    externals:GridViewSort.SortGlyphAscending="/Resources/Program Icons/Sort Up.png"
    externals:GridViewSort.SortGlyphDescending="/Resources/Program Icons/Sort Down.png">

    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Height" Value="36" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn lvl:FixedColumn.Width="36">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="{Binding Path=., Converter={StaticResource ComponentToIconPathConverter}}" Width="32"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Name" lvl:ProportionalColumn.Width="1" externals:GridViewSort.PropertyName="Name">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <ctl:EditableTextBlock Text="{Binding Name}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Type" lvl:ProportionalColumn.Width="1" externals:GridViewSort.PropertyName="Type">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Type}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>

    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Expander IsExpanded="True" x:Name="xpComponents">
                                    <Expander.Header>
                                        <StackPanel Orientation="Horizontal">
                                            <Image Source="{Binding Name, Converter={StaticResource StringToProgramIconPathConverter}}" Width="16" Margin="0,0,2,0"/>
                                            <TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="14" VerticalAlignment="Bottom" />
                                            <TextBlock Text=" (" FontSize="14" VerticalAlignment="Bottom" />
                                            <TextBlock Text="{Binding ItemCount}" FontSize="14" VerticalAlignment="Bottom" />
                                            <TextBlock Text=")" FontSize="14" VerticalAlignment="Bottom" />
                                        </StackPanel>
                                    </Expander.Header>
                                    <ItemsPresenter />
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </ListView.GroupStyle>
</ListView>

Любые идеи дляпричина этого, или даже для работыраунд, будет принята с благодарностью.

Было бы еще лучше, если бы я мог использовать окно вместо того, чтобы воссоздавать его (что теперь приводит к тому, что заголовки вообще не отображаются при смене источников), но я возьмучто я могу получить.

Заранее спасибо.=)

...