2017-09-01 28 views
5

मैं कुछ वस्तुओं को एक वृक्षदृश्य में प्रदर्शित करना चाहता हूं, लेकिन दुर्भाग्य से सफलता के बिना।नेस्टेड सूची के साथ TreeView

मैं वस्तुओं एक की ObservableCollection <ICustom> है: Settings.ListOfCustomers

वस्तु ICustom के इंटरफेस:

int Id { get; } 
int age { get; } 
CustomerType CustomerType { get; } 
ObservableCollection<IValue> ListOfValues { get; } 

ObservableCollection<IValue> ListOfValues भी कुछ गुण की तरह:

String Name { get; } 

मेरे दृश्य:

<TreeView ItemsSource="{Binding ListOfCustomers, UpdateSourceTrigger=PropertyChanged}"> 

    <TreeView.Resources> 

     <HierarchicalDataTemplate DataType="{x:Type customerConfig:ICustomer}"> 
      <TextBlock Text="{Binding Id}"/> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type valueConfig:IValue}" ItemsSource="{Binding ListOfValues}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}"/> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

    </TreeView.Resources> 


</TreeView> 

प्रश्न: मैं इन वस्तुओं को ट्री व्यू में कैसे प्रदर्शित कर सकता हूं? मेरा दृष्टिकोण (देखें "मेरा दृश्य") काम नहीं करता है।

+0

ITEMSource ListOfCustomers होना चाहिए। यह मानता है कि आप सेटिंग्स को संशोधित करना चाहते हैं जो केवल गेटर संपत्ति है। अन्य तरीकों का प्रयास करें – Ramankingdom

उत्तर

3

प्रश्न 1: ObservableCollections का लाभ है, कि दृश्य में सभी सूचनाएं स्वचालित रूप से की जाती हैं। तो आपको संग्रह से वस्तुओं को जोड़ने/हटाने के लिए NotifyPropertyChanged घटनाओं के बारे में चिंता करने की ज़रूरत नहीं है।

प्रश्न 2: आपका ViewModel आपका DataContext है? मुझे नहीं लगता कि ObservableCollection<ICustomer> संपत्ति कहां है? क्या आप इस कक्षा में संबंधों के बारे में अधिक जानकारी दे सकते हैं?

संपादित करें:

mm8 के जवाब के आधार पर, एक्स: प्रकार विशेषता एक ठोस प्रकार का होना चाहिए। तो कोड कुछ इस तरह दिखना चाहिए:

मेरा सुझाव है कि आप अपने ViewModel में एक ObservableCollection<ICustomer> ListOfCustomers है, तो आप ध्यान में रखते हुए बाध्य कर सकते हैं:

<TreeView ItemsSource="{Binding ListOfCustomers}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type Customer}"> 
       <TextBlock Text="{Binding Id}"/> 
      </HierarchicalDataTemplate> 

      <HierarchicalDataTemplate DataType="{x:Type modSettings:Value}" 
           ItemsSource="{Binding ListOfValues}"> 
       <TextBlock Text="{Binding Name}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

मुझे लगता है कि इस सूत्र के लिए एक अधिक विस्तृत समाधान प्रदान करता है आपके समस्या: Implement WPF treeview with different Parent Nodes a well as different child nodes?

EDIT2:

मैं आपकी आवश्यकताओं से मेल करने के लिए एक सा मेरी कोड बदल गया है,। यह सभी नोड्स प्रदर्शित करना चाहिए:

<TreeView ItemsSource="{Binding ListOfCustomers}" > 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Path=ListOfValues}" DataType="{x:Type Customer}"> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <HierarchicalDataTemplate DataType="{x:Type modSettings:Value}"> 
         <TextBlock Text="{Binding Path=Name}"/> 
        </HierarchicalDataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
       <TextBlock Text="{Binding Path=Id}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 
+0

इस तरह से मैं केवल ListOfCustomers – Philies

+0

की वस्तुओं को देख सकता हूं क्षमा करें, मेरे कार्यान्वयन में कोई गलती हुई थी। मैंने अपना जवाब सही कोड के साथ संपादित किया। मुझे उम्मीद है कि यह आपकी समस्या हल करता है। –

2

मैं नेस्टेड सूचियाँ ObservableCollection करने के लिए सभी सूचियाँ परिवर्तित कर दिया है, यह भी। क्या यह आवश्यक और सही है?

जब तक आप रनटाइम पर गतिशील रूप से संग्रह में आइटम जोड़ने का इरादा नहीं रखते हैं तब तक यह आवश्यक नहीं है। इसके बाद TreeView में स्वचालित रूप से दिखाई देने के लिए आपको ObservableCollection<T> का उपयोग करने की आवश्यकता है। अन्यथा आप List<T> का भी उपयोग कर सकते हैं।

मैं इन वस्तुओं को TreeView में प्रदर्शित कैसे प्रदर्शित कर सकता हूं?

आप क्योंकि आप TreeView की Items संपत्ति के लिए खाका जोड़ने त्रुटि संदेश मिलता है। उन्हें Resources संपत्ति में जोड़ा जाना चाहिए, यानी आपको <TreeView.Resources> तत्व जोड़ने की आवश्यकता है। DataType संपत्ति एक इंटरफ़ेस प्रकार लागू नहीं होती हैं करने के लिए सेट के साथ

Why can't a DataTemplate bind to an interface when that DataTemplate was explicitly returned from a DataTemplateSelector?

टेम्पलेट:

इस पढ़ना चाहिए। तो आपको या तो HierarchicalDataTemplate प्रति कंक्रीट प्रकार को परिभाषित करना चाहिए या DataTemplateSelector का उपयोग करना चाहिए।