我想在TreeView中显示任意XML,并带有展开和折叠的节点,同时显示元素名称和属性集及其值。我想我可以使用HierarchicalDataTemplate做到这一点。

我已经看到了使用HierarchicalDataTemplate来显示任意XML元素和文本节点的提示,如下所示:

  <Window.Resources> 
    <HierarchicalDataTemplate x:Key="NodeTemplate"> 
      <TextBlock x:Name="tbName" Text="?" /> 
      <HierarchicalDataTemplate.ItemsSource> 
        <Binding XPath="child::node()" /> 
      </HierarchicalDataTemplate.ItemsSource> 
      <HierarchicalDataTemplate.Triggers> 
        <DataTrigger Binding="{Binding Path=NodeType}" Value="Text"> 
          <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Value}"/> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
          <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Name}"/> 
        </DataTrigger> 
      </HierarchicalDataTemplate.Triggers> 
    </HierarchicalDataTemplate> 
    <XmlDataProvider x:Key="xmlDataProvider"> 
    </XmlDataProvider> 
  </Window.Resources> 
  .... 
 
  <TreeView Name="treeView1" 
          ItemsSource="{Binding Source={StaticResource xmlDataProvider}, XPath=*}" 
          ItemTemplate= "{StaticResource NodeTemplate}"/> 

哪个很棒。它显示每个元素的元素名称和文本。但是我的XML使用属性来携带信息。该模式很复杂,我没有一个正式的定义,因此现在我将其视为任意XML。

最简单的文档如下所示:
<c4soap name="GetVersionInfo" seq="" result="1"> 
  <versions> 
    <version name="Director"  
             version="2.1.0.126418"  
             buildtype=""  
             builddate="Jun  1 2011" buildtime="14:52:43" /> 
    <version name="MediaManager"  
             version="2.1.0.126418"  
             buildtype=""  
             builddate="Jun  1 2011"  
             buildtime="14:36:17" /> 
  </versions> 
</c4soap> 

使用上面的HierarchicalDataTemplate定义,得到以下显示:

不完全是我想要的。对于每个节点,我想同时显示元素名称和属性集及其值。

我尝试了这个:
  <Window.Resources> 
    <HierarchicalDataTemplate x:Key="NodeTemplate"> 
      <WrapPanel 
          Focusable="False"> 
        <TextBlock x:Name="tbName" Text="?" /> 
        <TextBlock x:Name="tbAttrs" Text="?" /> 
      </WrapPanel> 
      <HierarchicalDataTemplate.ItemsSource> 
        <Binding XPath="child::node()" /> 
      </HierarchicalDataTemplate.ItemsSource> 
      <HierarchicalDataTemplate.Triggers> 
        <DataTrigger Binding="{Binding Path=NodeType}" Value="Text"> 
          <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Value}"/> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
          <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Name}"/> 
          <Setter TargetName="tbAttrs" Property="Text" Value="{Binding Path=Attributes}"/> 
        </DataTrigger> 
      </HierarchicalDataTemplate.Triggers> 
    </HierarchicalDataTemplate> 
    <XmlDataProvider x:Key="xmlDataProvider"> 
    </XmlDataProvider> 
  </Window.Resources> 

...这让我有点接近,但是 Value="{Binding Path=Attributes}"在TreeView中显示“(Collection)”。

除了元素名称,我如何简单地显示所有实际的属性名称和值?

请您参考如下方法:

我在模板中添加了ItemsControl,如下所示:

<Window.Resources> 
  <SolidColorBrush x:Key="xmlValueBrush" Color="Blue" /> 
  <SolidColorBrush x:Key="xmAttributeBrush" Color="Red" /> 
  <SolidColorBrush x:Key="xmlTagBrush" Color="DarkMagenta" /> 
  <SolidColorBrush x:Key="xmlMarkBrush" Color="Blue" /> 
  <DataTemplate x:Key="attributeTemplate"> 
    <StackPanel Orientation="Horizontal" 
                Margin="3,0,0,0" 
                HorizontalAlignment="Center"> 
      <TextBlock Text="{Binding Path=Name}" 
                 Foreground="{StaticResource xmAttributeBrush}"/> 
      <TextBlock Text="=&quot;" 
                 Foreground="{StaticResource xmlMarkBrush}"/> 
      <TextBlock Text="{Binding Path=Value}" 
                 Foreground="{StaticResource xmlValueBrush}"/> 
      <TextBlock Text="&quot;" 
                 Foreground="{StaticResource xmlMarkBrush}"/> 
    </StackPanel> 
  </DataTemplate> 
 
  <HierarchicalDataTemplate x:Key="nodeTemplate"> 
    <StackPanel Orientation="Horizontal" 
        Focusable="False"> 
      <TextBlock x:Name="tbName" Text="?" /> 
      <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="child::node()" /> 
    </HierarchicalDataTemplate.ItemsSource> 
    <HierarchicalDataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Text"> 
        <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Value}"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
        <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Name}"/> 
      </DataTrigger> 
    </HierarchicalDataTemplate.Triggers> 
  </HierarchicalDataTemplate> 
  <XmlDataProvider x:Key="xmlDataProvider"> 
  </XmlDataProvider> 
</Window.Resources> 

现在,它显示元素名称,属性集及其值,如下所示:


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!