5

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

विशेष रूप से, हम इस विशेष नोड स्तर पर एक विशिष्ट सॉर्टिंग की अनुमति देने की कोशिश कर रहे हैं। हमारा एकमात्र अन्य विकल्प व्यूमोडेल में स्वयं को सॉर्ट करना है, लेकिन यह दर्द हो जाता है क्योंकि हम ऑब्जर्जेबल कोलेक्शन का उपयोग कर रहे हैं जो स्वयं सॉर्टिंग का समर्थन नहीं करते हैं। दरअसल, इस विषय पर हमने जो भी लेख देखा है, उस स्थिति के लिए आपको कलेक्शन व्यूसोर्स का उपयोग करना चाहिए, इसलिए यह सवाल है।

उदाहरण के लिए, इस काम करता है ...

<HierarchicalDataTemplate x:Key="CategoryTemplate" 
    ItemTemplate="{StaticResource TreeViewSymbolTemplate}" 
    ItemsSource="{Binding Symbols}"> 

    <TextBlock Text="{Binding Name}" FontWeight="Bold" /> 

</HierarchicalDataTemplate> 

लेकिन यह नहीं है ...

<HierarchicalDataTemplate x:Key="CategoryTemplate" 
    ItemTemplate="{StaticResource TreeViewSymbolTemplate}"> 

    <HierarchicalDataTemplate.ItemsSource> 
     <Binding> 
      <Binding.Source> 
       <CollectionViewSource Source="{Binding Symbols}" /> 
      </Binding.Source> 
     </Binding> 
    </HierarchicalDataTemplate.ItemsSource> 

    <TextBlock Text="{Binding Name}" FontWeight="Bold" /> 

</HierarchicalDataTemplate> 

है जैसे कि यह होगा मुझे लगता है, लेकिन ऐसा नहीं है। दोबारा, हम संग्रह टेम्पलेट को डेटा टेम्पलेट के समान स्तर पर नहीं डाल सकते हैं क्योंकि प्रत्येक टेम्पलेट के लिए एक उदाहरण होना आवश्यक है क्योंकि प्रत्येक के पास अपने स्वयं के आइटम हैं (हालांकि वे सभी सॉर्टिंग मानदंड साझा करेंगे।)

एम

+0

वास्तव में यहाँ और अधिक उपयुक्त यह कर के मूल रास्ते का उत्तर प्राप्त करना चाहते हैं, या यहां तक ​​कि अगर CollectionViewSource DataTemplate के संसाधन हिस्से के अंदर था। –

+1

असल में, मुझे ऐसा करने का एक आसान तरीका मिला है कि मुझे वास्तव में पसंद है ... मैं सिर्फ कलेक्शन व्यूसोर्स को एक कनवर्टर में ले जाता हूं, और इसका उपयोग रिटर्न वैल्यू सेट करने के लिए करता हूं। अभी के लिए हम केवल बाध्यकारी समय पर 'नया' कर रहे हैं क्योंकि हमें बस इतना करना है, लेकिन तकनीकी रूप से हम पूर्व-हाइड्रेटेड लोगों को वापस कर सकते हैं जिनके संदर्भ में हमारे पास संदर्भ हैं। अगर तुम मुझसे पूछो और एक चैंप की तरह काम करता है तो बहुत डरावना! – MarqueIV

+0

मैं उसमें देख लूंगा। धन्यवाद। –

उत्तर

3

ठीक है ... तो यह वही नहीं है जो मैं करना चाहता था, लेकिन परिणाम बिल्कुल वही है, और कोई भी टिप्पणी नहीं करता है, अकेले जवाब दें, इसलिए मैं इसे एक के रूप में डाल रहा हूं।

हमारे लिए ऐसा करने का मूल कारण नोड-विशिष्ट सॉर्टिंग होना था। जबकि हमें कलेक्शन व्यूसोर्स को काम करने के लिए कभी नहीं मिला, हमने सीधे नोड्स पर सॉर्टिंग लागू करने का प्रबंधन किया। यह चाल नोड निर्माण समय पर या तो ऐसा करने के लिए है, जैसे कि नोड फैलता है (हम बाध्यकारी का उपयोग कर रहे हैं ताकि हम मैन्युअल रूप से नोड्स नहीं बना सकें।)

ध्यान दें कि हमारा वास्तविक कोड ट्रैक करता है अगर हम पहले से ही कोड में कोड को लागू कर चुके हैं, इसलिए यह प्रत्येक 'विस्तारित' ईवेंट पर नहीं किया जाता है, लेकिन यह कोड इस प्रश्न के लिए अप्रासंगिक है इसलिए मैंने इसे संक्षिप्तता के लिए छोड़ दिया। फिर भी, आपको कुछ समान जोड़ना चाहिए।

वैसे भी, आपके द्वारा छँटाई प्रति नोड कर सकते हैं ...

private void tvSymbols_Expanded(object sender, RoutedEventArgs e) { 

    TreeViewItem node = e.OriginalSource as TreeViewItem; 
    if(node==null) return; 
    node.Items.SortDescriptions.Clear(); 
    node.Items.SortDescriptions.Add(new SortDescription("SomeField",  ListSortDirection.Ascending)); 
    node.Items.SortDescriptions.Add(new SortDescription("SomeOtherField", ListSortDirection.Descending)); 

} 

बेशक अगर किसी को अब भी पता लगा लेता है क्यों मूल प्रश्न के कोड, काम नहीं किया lemme पता है!

मार्क

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

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