更新数据后避免TreeView崩溃效果
问题描述:
我有一个TreeView用于显示事件。它的效果很好,但是每次新事件进入时,填充树会将树再次折叠到原始位置。当刷新时间小于1秒并且不允许用户与树的项目进行交互时,这是非常烦人的。 有什么办法可以避免这种行为?更新数据后避免TreeView崩溃效果
<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>
答
如果刷新整个EventAlertContainers
集合,就会发生。 WPF不知道新集合中的项目与旧集合中的项目相同。
而不是重新填充,保持相同的集合,并注意只添加和删除他们已经改变的项目。确保您的收藏品是ObservableCollection
或支持INotifyCollecitonChanged
,并且只根据需要进行最低限度的更改(添加,删除和更新)。
我不能改变这一点。我需要设计一些不同的东西。 – Manolete
那么你是直接绑定到你的模型?如果你是,你会倾向于有这样的问题。您应该将它们包装在提供视图所需功能的视图模型中,即收集已更改的通知。 –
viewModel包含每分钟更新一次的EventAlertContainers,并显示警报的全部数据集(新旧)。有没有办法做到这一点? – Manolete