2011-01-20 22 views
21

प्रत्येक ItemsControl इसकी सामग्री पैनल में संग्रहीत है? हम पैनल इस तरह XAML में इस्तेमाल किया जा करने के लिए निर्दिष्ट कर सकते हैं:आइटम का नियंत्रण कैसे प्राप्त करें जिसमें आइटम नियंत्रण की सामग्री है?

<ListView Name="LView"> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate > 
      <StackPanel/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 

मेरे सवाल यह है कि उस विशेष ItemsControl (प्रकार ItemsPanelTemplate का) ItemsPanel संपत्ति में प्रयोग किया जाता है Panel के कहने पाने के लिए है? उदाहरण के लिए ListView उपरोक्त कोड नमूने से LView कहा जाता है?

मैं Name संपत्ति या x:Name उपयोग नहीं कर सकते, यह किसी भी ItemsControl भी डिफ़ॉल्ट ItemsPanel का उपयोग करने वालों के लिए काम करना चाहिए।

यदि यह स्पष्ट नहीं है तो कृपया टिप्पणी करें, मुझे लगता है कि बहुत आसान समाधान है। अगर यह जटिल लगता है कि केवल इसलिए कि मैं इसे ठीक से समझा नहीं सकता।

+0

आप कहाँ से कि उदाहरण प्राप्त करने की कोशिश कर रहे हैं? क्या यह 'आइटम नियंत्रण' से है या इसके अंदर आइटम टेम्पलेट्स में से एक है? –

+0

बिल्कुल 'आइटम पैनेल टेम्पलेट' से। मैं निश्चित रूप से इसे आइटम टेम्पलेट्स से प्राप्त नहीं करना चाहता हूं। – drasto

+0

क्या मैंने आपके प्रश्न को सही ढंग से समझ लिया था या आप कुछ और ढूंढ रहे थे? –

उत्तर

3

मैं आपको कामकाजी कोड प्रदान नहीं कर सकता, लेकिन VisualTreeHelper class पर एक नज़र डालें। VisualTreeHelper कक्षा के साथ आप दृश्य पेड़ को अपने टेम्पलेट और पैनल पर नीचे जा सकते हैं।

15

यह थोड़ा मुश्किल है क्योंकि आप पैनल के नाम पता नहीं है तो आप FindName उपयोग नहीं कर सकते आदि यह ज्यादातर मामलों के लिए काम करेंगे, जहां एक ItemsPresenter

private Panel GetItemsPanel(DependencyObject itemsControl) 
{ 
    ItemsPresenter itemsPresenter = GetVisualChild<ItemsPresenter>(itemsControl); 
    Panel itemsPanel = VisualTreeHelper.GetChild(itemsPresenter, 0) as Panel; 
    return itemsPanel; 
} 

GetVisualChild का एक कार्यान्वयन मौजूद है है

private static T GetVisualChild<T>(DependencyObject parent) where T : Visual 
{ 
    T child = default(T); 

    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
      child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
     { 
      break; 
     } 
    } 
    return child; 
} 

हालांकि, आइटमपैनल हमेशा उपयोग नहीं किया जाता है। इयान ग्रिफिथ्स द्वारा एक महान स्पष्टीकरण के लिए this answer देखें।

2
protected Panel ItemsHost { 
    get { 
     return (Panel) typeof (MultiSelector).InvokeMember("ItemsHost", 
      BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance, 
      null, this, null); 
    } 
} 

यह मेरे ItemsControl में एक आकर्षण की तरह काम करता है! उस ने कहा, Panel पर IsItemsHost="True" है, लेकिन इसके बिना भी काम कर सकता है।

चाल इस सूत्र से है: Can I access ItemsHost of ItemsControl using reflection?