2009-05-07 22 views
7

पर बाध्य करें मैं टाइपकॉन्टर का उपयोग करके किसी भी XML दस्तावेज़ को WPF TreeView में बाध्य करना चाहता हूं।किसी भी XML दस्तावेज़ को WPF TreeView

मेरा मूल समाधान रिकर्सन का उपयोग करना था, लेकिन जब दस्तावेज़ बड़ा यूआई भारी रूप से बंधे होते हैं।

TypeConverter के बारे में है, लेकिन विशेष रूप से नोड/तत्व संयोजन के लिए लिंक वार्ता के बाद: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/edd843b7-b378-4c2d-926f-c053dbd7b340

यदि ज्ञात नहीं क्या क्या XML दस्तावेज़ की तरह दिखता है? चूंकि यह प्रदर्शन उद्देश्यों के लिए है, इसलिए मुझे इस बिंदु पर कार्यक्षमता के बारे में ज्यादा परवाह नहीं है, मैं सिर्फ एक वृक्ष दृश्य में एक्सएमएल बांधना चाहता हूं।

उत्तर

3

इसलिए मैंने किसी भी XML दस्तावेज़ को बाध्य करने के बारे में एक सवाल पूछा है कि स्कीमा को निम्न तरीके से पेड़ दृश्य के बावजूद कैसे करें: 1. एक्सएमएल प्रदाता और पदानुक्रमित डेटाटाम्प्लेट के माध्यम से WPF TreeView पर XML दस्तावेज़ को बाध्य करें। 2. प्रदर्शन उन निम्न स्वरूप में बच्चे नोड्स है कि सहित एक्सएमएल दस्तावेज़ के सभी नोड्स:

> node1

node1 सामग्री

>ChildNode1 

     ChildNode1 Contents 

      >ChildNode1'sChildNode 

       ChildNode1'sChildNode Contents 

> node2

Node2 Contents 

समस्या थी कि मेरा TreeView प्रत्येक XmlNode नाम प्रॉपर्टी को TreeItem पर बाध्य कर रहा था। टेक्स्ट XmlNode के मामले में यह #text को TreeItem से बांध देगा जो मैं नहीं चाहता था। http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cbdb2420-1403-436f-aa7f-b1e3b1acb398/

तो चाल चलाता उपयोग करने के लिए का सामना करना पड़ा नोड के प्रकार के आधार मान सेट करने गया था:

तो MSDN मंच पर एक पोस्ट के माध्यम से मैं अपने जवाब मिला है।

चेतावनी यह है कि अन्य प्रकार के नोड्स को अनदेखा कर दिया जाएगा और XML दस्तावेज़ में भिन्न तत्व हो सकते हैं, इसलिए यह हर प्रकार के नोड के लिए काम नहीं कर सकता है।

यहाँ XAML है:

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1" Height="250" Width="450"> 

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

<Grid > 
    <TreeView Name="treeView1" 
       Background="AliceBlue" 
       ItemsSource="{Binding Source={StaticResource xmlDataProvider}, XPath=*}" 
       ItemTemplate= "{StaticResource NodeTemplate}"/> 
</Grid> 

public Window1() 
{ 
InitializeComponent(); 
XmlDataProvider dataProvider = this.FindResource("xmlDataProvider") as XmlDataProvider; 
     XmlDocument doc = new XmlDocument(); 
      // Testdocument  doc.LoadXml(
      @"<root> 
       <child1>text1<child11>text11</child11> 
       </child1> 
       <child2>text2<child21>text21</child21> 
        <child22>text22</child22> 
       </child2> 
       </root>"); 
     dataProvider.Document = doc; 
    } 
6

यह कुछ सरल संशोधनों के साथ अन्य नोड प्रकार के लिए काम करता है। सबसे पहले, HierarchicalDataTemplate.ItemsSource बाध्यकारी XPath को किसी भी बच्चे नोड और किसी भी विशेषता को अनुमति देने के लिए "बच्चे :: नोड() | विशेषता :: *" में बदला जाना चाहिए। फिर, अन्य नोड टाइप के लिए डेटाट्रिगर्स जोड़ें। नीचे दिया गया उदाहरण मेरे लिए काम किया। नोट है कि मैं विभिन्न NodeTypes के लिए माउस जोड़ा, तो आप उन्हें दूर करने के लिए चाहते हो सकता है:

 <HierarchicalDataTemplate x:Key="NodeTemplate"> 
     <StackPanel Orientation="Horizontal"> 
     <Image x:Name="icon" VerticalAlignment="Center" Margin="1,1,4,1"/> 
     <TextBlock x:Name="name" Text="" /> 
     <TextBlock x:Name="inter" Text="" /> 
     <TextBlock x:Name="value" Text="" /> 
     </StackPanel> 
     <HierarchicalDataTemplate.ItemsSource> 
      <Binding XPath="child::node()|attribute::*" /> 
     </HierarchicalDataTemplate.ItemsSource> 
     <HierarchicalDataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
       <Setter TargetName="icon" Property="Source" Value="icons/element.png"></Setter> 
       <Setter TargetName="name" Property="Text" Value="{Binding Path=Name}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Text"> 
       <Setter TargetName="icon" Property="Source" Value="icons/text.png"></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Attribute"> 
       <Setter TargetName="icon" Property="Source" Value="icons/attribute.png"></Setter> 
       <Setter TargetName="name" Property="Text" Value="{Binding Path=Name}"></Setter> 
       <Setter TargetName="inter" Property="Text" Value=": "></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="CDATA"> 
       <Setter TargetName="icon" Property="Source" Value="icons/cdata.png"></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Comment"> 
       <Setter TargetName="icon" Property="Source" Value="icons/comment.png"></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="ProcessingInstruction"> 
       <Setter TargetName="icon" Property="Source" Value="icons/pi.png"></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
     </HierarchicalDataTemplate.Triggers> 
    </HierarchicalDataTemplate> 
1

निम्नलिखित धागे पर मेरा उत्तर पर एक नजर डालें - Binding XML data to WPF treeview Control मैं मानते हैं कि यह वास्तव में क्या आप में for.The लिंक की तलाश कर रहे है धागा एक पोस्ट को इंगित करता है जो आपको स्रोत कोड डाउनलोड करने के विकल्प के साथ चरण-दर-चरण उदाहरण देता है। उदाहरण को XML दस्तावेज़ को एक WPF ट्री व्यू

पर बाध्य करने के लिए इस तरह लिखा गया है।
संबंधित मुद्दे