Избегайте эффекта сжатия в TreeView после обновления данных - PullRequest
1 голос
/ 22 ноября 2011

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

<TreeView Margin="1" BorderThickness="0" Name="eventsTree" ItemsSource="{Binding EventAlertContainers}" 
              Background="#00000000" ScrollViewer.VerticalScrollBarVisibility="Auto" FontSize="14" 
              VirtualizingStackPanel.IsVirtualizing="True">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type C:EventAlertContainer}" ItemsSource="{Binding EventAlerts}">
            <StackPanel Orientation="Horizontal">
                <Image Width="20" Height="20" Margin="3,0" Source="Resources\Process_info_32.png" />
                <TextBlock FontWeight="Bold" FontSize="16" Text="{Binding Description}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type C:EventAlert}" ItemsSource="{Binding Events}">
            <StackPanel Orientation="Horizontal">
                <Image Width="20" Height="20" Margin="0,0" Source="Resources\clock2_32.jpg" />
                <TextBlock FontWeight="DemiBold" FontSize="14" Text="{Binding Name}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type C:Event}">
            <StackPanel Orientation="Horizontal">
                <Image Width="20" Height="20" Margin="0,0" Source="Resources\Task_32.png" />
                <StackPanel Orientation="Vertical">
                    <TextBlock FontSize="12" Text="{Binding Name}" />
                </StackPanel>
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

1 Ответ

3 голосов
/ 22 ноября 2011

Если вы обновите всю коллекцию EventAlertContainers, это произойдет.WPF не знает, что элементы в новой коллекции совпадают с элементами в старой коллекции.

Вместо повторного заполнения храните те же коллекции и старайтесь добавлять и удалять элементы только там, где они есть.изменилось.Убедитесь, что ваши коллекции ObservableCollection s или поддерживают INotifyCollecitonChanged и вносят только минимальные изменения (добавление, удаление и обновление) по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...