2012-08-16 11 views
6

私は問題があります。 WPFプロジェクトでTreeViewを使用してXMLデータを視覚化しています。問題は、XmlDocumentを編集するとTreeViewに更新されないということです。しかし、私はSelectedNodeをチェックすると、それは私のedittedとXmlNodeであることに気づいた。だから、私の "Edit"メソッドは正常に動作しますが、ツリーのビジュアルリフレッシュには問題があります。 .Refresh()または.Items.Refresh()も機能しません。WPF TreeView refreshing

ここに私の木のテンプレートです:ここで

<DataTemplate x:Key="AttributeTemplate"> 
    <StackPanel Orientation="Horizontal" 
      Margin="3,0,0,0" 
      HorizontalAlignment="Center"> 
     <TextBlock Text="{Binding Path=Name}" 
      Foreground="{StaticResource xmAttributeBrush}" FontFamily="Consolas" FontSize="8pt" /> 
     <TextBlock Text="=&quot;" 
      Foreground="{StaticResource xmlMarkBrush}" FontFamily="Consolas" FontSize="8pt" /> 
     <TextBlock Text="{Binding Path=Value, Mode=TwoWay}" 
      Foreground="{StaticResource xmlValueBrush}" FontFamily="Consolas" FontSize="8pt" /> 
     <TextBlock Text="&quot;" 
      Foreground="{StaticResource xmlMarkBrush}" FontFamily="Consolas" FontSize="8pt" /> 
    </StackPanel> 
</DataTemplate> 

<HierarchicalDataTemplate x:Key="NodeTemplate"> 
    <StackPanel Orientation="Horizontal" Focusable="False"> 
     <TextBlock x:Name="tbName" Text="?" FontFamily="Consolas" FontSize="8pt" /> 
     <ItemsControl 
      ItemTemplate="{StaticResource AttributeTemplate}" 
      ItemsSource="{Binding Path=Attributes}" 
      HorizontalAlignment="Center"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </StackPanel> 
    <HierarchicalDataTemplate.ItemsSource> 
     <Binding XPath="*" /> 
    </HierarchicalDataTemplate.ItemsSource> 
    <HierarchicalDataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=NodeType}" Value="Text"> 
      <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Value, Mode=TwoWay}"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
      <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Name}"/> 
     </DataTrigger> 
    </HierarchicalDataTemplate.Triggers> 
</HierarchicalDataTemplate> 

<Style x:Key="TreeViewAllExpandedStyle" TargetType="{x:Type TreeView}"> 
    <Style.Resources> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="IsExpanded" Value="True" /> 
     </Style> 
    </Style.Resources> 
</Style> 

<Style x:Key="TreeViewAllCollapsedStyle" TargetType="{x:Type TreeView}"> 
    <Style.Resources> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="IsExpanded" Value="False" /> 
     </Style> 
    </Style.Resources> 
</Style> 

Window.Resources次のとおりです。

<Window.Resources> 
    <XmlDataProvider x:Key="XmlData" /> 
</Window.Resources> 

は、ここに私の木です:

<TreeView x:Name="XmlTree" Grid.Row="1" 
     ItemsSource="{Binding Source={StaticResource XmlData}, XPath=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
     ItemTemplate="{StaticResource NodeTemplate}" 
     SelectedItemChanged="XmlTree_SelectedItemChanged" /> 

そしてここでは、背後に私のコードです

2つ目は、多くの時間が最終的に解決策を見つけた後XmlTree.Items.Clear();

答えて

11

をしようとしているときに(私はNullReferenceExceptionを持っている別のデータのために再びそれを使用することができるようにするために、私のツリーをクリアする方法、です!

private void RefreshViews() 
{ 
    XmlEditor.Clear(); 
    XmlEditor.Text = IndentXml(); 

    UnselectSelectedItem(); 

    XmlTree.Items.Refresh(); 
    XmlTree.UpdateLayout(); 
} 

private void UnselectSelectedItem() 
{ 
    if (XmlTree.SelectedItem != null) 
    { 
     var container = FindTreeViewSelectedItemContainer(XmlTree, XmlTree.SelectedItem); 
     if (container != null) 
     { 
      container.IsSelected = false; 
     } 
    } 
} 

private static TreeViewItem FindTreeViewSelectedItemContainer(ItemsControl root, object selection) 
{ 
    var item = root.ItemContainerGenerator.ContainerFromItem(selection) as TreeViewItem; 
    if (item == null) 
    { 
     foreach (var subItem in root.Items) 
     { 
      item = FindTreeViewSelectedItemContainer((TreeViewItem)root.ItemContainerGenerator.ContainerFromItem(subItem), selection); 
      if (item != null) 
      { 
       break; 
      } 
     } 
    } 

    return item; 
} 
+4

あなたは最高です!私はこれらの魔法のラインが必要でした: XmlTree.Items.Refresh(); XmlTree.UpdateLayout(); ありがとう、私の問題を解決! – Alex

+0

Yeee、彼らは誰かを緊張させることができます:) – Nickon