2011-11-22 64 views
0

我有一个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> 

回答

1

如果刷新整个EventAlertContainers集合,就会发生。 WPF不知道新集合中的项目与旧集合中的项目相同。

而不是重新填充,保持相同的集合,并注意只添加和删除他们已经改变的项目。确保您的收藏品是ObservableCollection或支持INotifyCollecitonChanged,并且只根据需要进行最低限度的更改(添加,删除和更新)。

+0

我不能改变这一点。我需要设计一些不同的东西。 – Manolete

+0

那么你是直接绑定到你的模型?如果你是,你会倾向于有这样的问题。您应该将它们包装在提供视图所需功能的视图模型中,即收集已更改的通知。 –

+0

viewModel包含每分钟更新一次的EventAlertContainers,并显示警报的全部数据集(新旧)。有没有办法做到这一点? – Manolete