2011-05-26 13 views
5

मेरे पास एक ऐसा एप्लिकेशन है जो डेटाबेस टेबल पढ़ता है और इसे एक वृक्षदृश्य में रखता है। treeview के लिए वर्तमान ItemTemplate इस तरह दिखता है:WPF प्रोग्रामेटिक रूप से वृक्षदृश्य आइटम टेम्पलेट/कॉलम

<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding SubOrganLocations}"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="35" /> 
       <ColumnDefinition Width="35" /> 
       <ColumnDefinition Width="35" /> 
      </Grid.ColumnDefinitions> 
      <TextBlock Grid.Column="0" Text="{Binding OrganDisplayName}" /> 
      <TextBox Grid.Column="1" IsEnabled="True" /> 
      <TextBox Grid.Column="2" IsEnabled="True" /> 
      <TextBox Grid.Column="3" IsEnabled="True" /> 
     </Grid> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 

हालांकि, भविष्य में और अधिक कॉलम (एक तालिका में विशिष्ट मानों की संख्या द्वारा निर्धारित) जोड़ा जाना चाहिए कि हो सकता है, तो मैं ' मैं गतिशील रूप से इसे बनाने की कोशिश कर रहा हूँ। मुझसे यह कैसे होगा?

+2

अपने ग्रिड को एक कस्टम नियंत्रण के साथ बदलें जो आपके 'आइटम स्रोत' के लिए उपयोग की जा रही वस्तु को लेता है और ग्रिड को गतिशील बनाता है। जहां तक ​​मुझे पता है, आप XAML में जो कुछ भी खोज रहे हैं वह आप नहीं कर सकते हैं। – FlyingStreudel

+0

धन्यवाद, मुझे नहीं लगता था कि यह एक्सएएमएल में किया जा सकता है, यही कारण है कि मैं थोड़ा उलझन में था। मैं कस्टम नियंत्रण बनाने के बारे में कैसे जा सकता हूं? और चूंकि वह ग्रिड (एक्सएएमएल कोड के बजाए) बनायेगा, इसी तरह के एक्सएएमएल कोड कैसा दिखेंगे? – Saggio

उत्तर

2

कुछ इस तरह संभव हो सकता है:

<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding SubOrganLocations}"> 
     <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding OrganDisplayName}" /> 

       <!-- If the fields to bind to can be exposed via a collection: 
       <ItemsControl ItemsSource="{Binding Fields}"> --> 
       <ItemsControl ItemsSource="{Binding, Converter={StaticResource SomeCleverConverter}}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel Orientation="Horizontal" /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <TextBox Text="{Binding Value}" Width="35" /> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 

      </StackPanel> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 

यह निर्भर करता है अगर TreeViewItem की DataContext (SubOrganLocation) क्षेत्रों का एक संग्रह का पर्दाफाश कर सकते हैं, या कम से कम उन्हें एक कनवर्टर के साथ प्राप्त करने के लिए इस्तेमाल किया जा। फ़ील्ड के संग्रह का पर्दाफाश करना सबसे सरल और संभवतः आसान होगा ताकि आप {Binding Fields} कर सकें।

0

फ्लाइंगस्ट्रेडेल ने कहा, कस्टम नियंत्रण का उपयोग इस मामले में एक अच्छा दृष्टिकोण है। एक्सएएमएल कुछ ऐसा दिखता है:

 <!-- entity 1 --> 
     <HierarchicalDataTemplate DataType="{x:Type local:Entity1}" ItemsSource="{Binding Items, Mode=OneWay}"> 
      <Grid> 
       <local:Entity1Control/> 
      </Grid> 
     </HierarchicalDataTemplate> 

     <!-- entity 2 (leaf) --> 
     <DataTemplate DataType="{x:Type local:Entity2}"> 
      <Grid> 
       <local:Entity2Control /> 
      </Grid> 
     </DataTemplate> 

आपको कस्टम नियंत्रणों का उपयोग करने की आवश्यकता नहीं है, तो आप प्रत्येक टेम्पलेट में अपने विशिष्ट कॉलम डाल सकते हैं।