2011-10-03 10 views
6

मैं ट्री व्यू में मनमानी एक्सएमएल प्रदर्शित करना चाहता हूं, नोड्स को विस्तार और ढहने के साथ, तत्व का नाम और गुणों का सेट और उनके मूल्य दोनों दिखा रहा हूं। मुझे लगता है कि मैं इसे HierarchicalDataTemplate के साथ कर सकता हूं।मैं XML तत्वों और विशेषताओं को प्रदर्शित करने के लिए HierarchicalDataTemplate का उपयोग कैसे कर सकता हूं?

मैं संकेत देखा है HierarchicalDataTemplate उपयोग करने के लिए मनमाने ढंग से एक्सएमएल तत्वों, और पाठ नोड्स, इस तरह प्रदर्शित करने के लिए:

<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}"/> 

कौन सा अच्छा काम करता है। यह प्रत्येक तत्व के लिए तत्व नाम और पाठ प्रदर्शित करता है। लेकिन मेरा एक्सएमएल जानकारी ले जाने के लिए विशेषताओं का उपयोग करता है। स्कीमा जटिल है और मेरे पास औपचारिक परिभाषा नहीं है, इसलिए अब मैं इसे मनमानी एक्सएमएल के रूप में देख रहा हूं।

enter image description here

नहीं काफी मैं क्या चाहते हैं:

सरलतम दस्तावेज़ इस तरह दिखता है:

<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> 

... जो मुझे थोड़े करीब हो जाता है, लेकिन TreeView में Value="{Binding Path=Attributes}" परिणाम "(संग्रह)" का एक प्रदर्शन में:

मैं इस कोशिश की।

enter image description here

कैसे मैं बस सब वास्तविक विशेषता नाम और मान, तत्व नाम के साथ-प्रदर्शित कर सकते हैं?

+0

यू आप अंतिम कोड साझा कर सके कृपया? (+1 वहां है) :) –

उत्तर

9

मैं टेम्पलेट में एक 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> 

अब यह तत्व नाम दिखाता और विशेषताओं का सेट और उनके मान, इस तरह:

enter image description here

+0

यह बिल्कुल वैसा दिखता है जो मुझे चाहिए। क्या आप अपना कोड कृपया साझा कर सकते हैं? –

+0

दुर्भाग्य से नहीं। मेरा एचडी दुर्घटनाग्रस्त होने पर मेरा कोड खो गया था। – Cheeso

+0

इसे सुनकर खेद है! अंत में मैंने WebBrowser.Navigate ("c: \ data.xml") का उपयोग किया। तो यह मेरे लिए ठीक है! और जवाब Cheeso के लिए धन्यवाद !! –

4

आप विभिन्न नोड प्रकारों के लिए टेम्पलेट चयनकर्ता का भी उपयोग कर सकते हैं और सभी प्रकार के नोड्स के माध्यम से XPath नोड() | @ * लूप को उपयोग कर सकते हैं:

<TreeView 
    x:Name="TreeView" 
    ItemsSource="{Binding}" 
    ItemTemplateSelector="{DynamicResource ResourceKey=NodeTemplateSelector}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate x:Key="TextTemplate"> 
      <Grid> 
       <uixml:TextInputControl DataContext="{Binding}" /> 
      </Grid> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate x:Key="AttributeTemplate"> 
      <Grid> 
       <uixml:AttributeInputControl DataContext="{Binding}" /> 
      </Grid> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate x:Key="NodeTemplate" > 
      <TextBlock Text="{Binding Path=Name}" /> 
      <HierarchicalDataTemplate.ItemsSource> 
       <Binding XPath="child::node()|@*" /> 
      </HierarchicalDataTemplate.ItemsSource> 
     </HierarchicalDataTemplate> 
     <ui:XmlTemplateSelector 
      x:Key="NodeTemplateSelector" 
      NodeTemplate="{StaticResource NodeTemplate}" 
      TextTemplate="{StaticResource TextTemplate}" 
      AttributeTemplate="{StaticResource AttributeTemplate}" /> 
    </TreeView.Resources> 
</TreeView> 

और:

public class XmlTemplateSelector:DataTemplateSelector{ 
    public DataTemplate NodeTemplate { get; set; } 
    public DataTemplate TextTemplate { get; set; } 
    public DataTemplate AttributeTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) { 
     XmlNode node = (XmlNode)item; 
     switch (node.NodeType) { 
      case XmlNodeType.Attribute: 
       return AttributeTemplate; 
      case XmlNodeType.Element: 
       return NodeTemplate; 
      case XmlNodeType.Text: 
       return TextTemplate; 
     } 
     throw new NotImplementedException(String.Format("not implemented for type {0}", node.NodeType)); 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे