पर एक नजर है।
आप मूल रूप से आइटम को उसी तरह डिज़ाइन करते हैं जैसे आप उन्हें सामान्य डेटा ग्रिड में प्रदर्शित करते हैं, यानी प्रत्येक आइटम में प्रत्येक कॉलम के लिए एक संपत्ति होती है। सभी संभावनाओं में, आपका अंतर्निहित डेटा मॉडल पदानुक्रमित है, लेकिन ग्रिड को संग्रहित करने वाला संग्रह फ़्लैटन होने जा रहा है, यानी माता-पिता/बाल संबंधों के बावजूद पदानुक्रम में प्रत्येक नोड के लिए एक आइटम शामिल होगा। Level
, Children
, IsExpanded
, और IsVisible
:
आइटम दृश्य मॉडल कुछ अतिरिक्त गुण है। Level
नोड के पूर्वजों की गिनती है, Children
में बच्चे दृश्य मॉडल नोड्स, IsExpanded
यूआई में उपयोग किया जाता है, और IsVisible
सही है यदि नोड दिखाई दे रहा है।
public IEnumerable<NodeViewModel> VisibleDescendants
{
get
{
return Children
.Where(x => x.IsVisible)
.SelectMany(x => (new[] {x}).Concat(x.VisibleDescendants)));
}
}
आप नियंत्रण के पहले कॉलम में आइटम के लिए शैली में Level
, HasChildren
, और IsExpanded
का उपयोग करें:: यह भी एक संपत्ति VisibleDescendants
कहा जाता है को लागू करता है वे बाईं मार्जिन और आइकन की किस तरह (अगर कोई है) पर नियंत्रण है का प्रदर्शन किया।
आपको ExpandCommand
और CollapseCommand
गुणों को लागू करने की भी आवश्यकता है। ExpandCommand
सक्षम है यदि Children.Any()
सत्य है और IsExpanded
गलत है, और CollapseCommand
सक्षम है यदि Children.Any()
सत्य है और IsExpanded
सत्य है। इन आदेशों को निष्पादित करते समय, IsExpanded
का मान बदलें।
और यहां पर यह दिलचस्प हो जाता है। इसे लागू करने का सरल तरीका आपके लिए काम कर सकता है: आइटम को मूल दृश्य मॉडल द्वारा उजागर किया जाता है जिसका Items
संपत्ति संग्रह नहीं है। इसके बजाय, यह एक प्रगणक है कि बच्चे को देखने के मॉडल की श्रृंखला के नीचे यात्रा करता है और ही दिखाई नोड्स पैदावार है:
public IEnumerable<NodeViewModel> Items
{
get
{
return _Items
.Where(x => x.IsVisible)
.SelectMany(x => (new[] {x}).Concat(x.VisibleDescendants));
}
}
जब भी कोई वंशज के IsVisible
गुण परिवर्तन, जनक दृश्य मॉडल Items
संपत्ति है, जो डेटा बलों के लिए PropertyChanged
को जन्म देती है ग्रिड repopulate करने के लिए।
वहाँ एक कम सरल कार्यान्वयन भी जहां Items
संपत्ति एक वर्ग है कि INotifyCollectionChanged
लागू करता बना देते हैं, और जब वंशज नोड्स दिखाई/अदृश्य हो कि उचित CollectionChanged
घटनाओं को जन्म देती है, लेकिन आप केवल वहाँ जाने के लिए करता है, तो प्रदर्शन एक मुद्दा है चाहता हूँ ।
लेकिन मैं इसे डेटाग्रिड (संपादन योग्य) – Shimmy
+1 @Shimmy कॉम के साथ हाइब्रिड करना चाहता हूं http://www.codeproject.com/KB/WPF/wpf_treelistview_control.aspx का ments हिस्सा। यह दिखाता है कि इसे सूचीदृश्य – k3b
@ k3b के बजाय ग्रिड के साथ कैसे उपयोग किया जाए, आपको यह @ हेज निर्देशित करना चाहिए था। मुझे लगता है कि यह वास्तव में एक समस्या नहीं है @Shimmy अब और परवाह करता है ... बस कह रहा है ... –