2010-01-30 21 views
15

कहें कि मेरे पास एक बाइनरी पेड़ है, जहां डेटा संरचना की जड़ सिर्फ एक पेड़ नोड है। प्रत्येक नोड के लिए, बच्चे Children संपत्ति के माध्यम से पहुंच योग्य होते हैं। मैंने जो कोशिश की है वह यहां है। TreeRoot विरासत डेटा संदर्भ की एक संपत्ति है, लेकिन यह एक एकल नोड (संग्रह नहीं है) है।क्या मैं एक रूट रूट नोड में एक WPF TreeView बांध सकता हूं?

<UserControl.Resources> 
    <HierarchicalDataTemplate x:Key="TreeNodeTemplate" ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 

<Grid> 
    <TreeView ItemsSource="{Binding TreeRoot}" ItemTemplate="{StaticResource TreeNodeTemplate}" /> 
</Grid> 
+0

क्या नीचे दिए गए कोई भी जवाब आपकी समस्या का समाधान करते हैं, सैम? यदि हां, तो क्या आप उस उत्तर को स्वीकार कर सकते हैं जिसने आपकी समस्या को हल किया है? यदि नहीं, तो क्या आप गायब होने पर और जानकारी प्रदान कर सकते हैं? धन्यवाद! –

उत्तर

4

मुझे लगता है कि तुम्हारी समस्या है कि आपके श्रेणीबद्ध डेटा टेम्पलेट केवल रूट नोड के लिए आवेदन किया है, तो आप जड़ के बच्चों अतीत कुछ भी कभी नहीं देखना है। ऐसा करें:

<UserControl.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 

<Grid> 
    <TreeView ItemsSource="{Binding TreeRoot}"/> 
</Grid> 

कहाँ TreeNode अपने पेड़ नोड वर्ग का नाम है।

2

एवियाद की तरह, अगर आप DataType="{x:Type TreeNode}" का उपयोग करते हैं तो TreeView स्वचालित रूप से उस टेम्पलेट का उपयोग उस प्रकार के किसी ऑब्जेक्ट के लिए करेगा।

यदि आपके पदानुक्रम में कई प्रकार हैं, तो आप प्रत्येक के लिए डेटा प्रकार के साथ एकाधिक श्रेणीबद्ध डेटाटाम्प्लेट निर्दिष्ट कर सकते हैं। इससे TreeView प्रत्येक प्रकार को अलग-अलग संभाल देगा।

<HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}"> 
    <TextBlock Text="{Binding Name}" /> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate DataType="{x:Type TreeLeaf}"> 
    <TextBlock Text="{Binding Message}" Background="Red" /> 
</HierarchicalDataTemplate> 
9

मैं इस समस्या थी और यह निष्कर्ष निकाला है कि मैं एक तरह से रूट नोड निर्दिष्ट करने के लिए के रूप में एक treeview के लिए एक गैर-संग्रह के लिए बाध्य नहीं कर सका। तो मैंने अपने मॉडल व्यू में त्वरित परिवर्तन करने के लिए और रूट नोड का प्रतिनिधित्व करने वाली संपत्ति को 1 आइटम का संग्रह करने के लिए किया था।

public class ContainerViewModel 
{ 
    public ObservableCollection<TreeNodeViewModel> RootNodes { get; private set; } 

    public ContainerViewModel() 
    { 
     // Create a single node in the collection of root nodes 
     RootNodes = new ObservableCollection<TreeNodeViewModel>(); 
     RootNodes.Add(new TreeNodeViewModel()); 
    } 
} 

public class TreeNodeViewModel 
{ 
    public ObservableCollection<TreeNodeViewModel> Children { get; set; } 
} 

मैं ऊपर एक ObservableCollection <> थे, लेकिन एक सूची <> की तरह कुछ सस्ता उपयोग करने के लिए जब से तुम संग्रह बदलने के लिए (कम से कम अपने परिदृश्य में) की उम्मीद नहीं है और अधिक समझ कर सकता है।

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