2011-11-22 24 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