2010-10-01 9 views
7

मैं एक विशिष्ट प्रारूप में आइटम प्रस्तुत करने के लिए आइटम्स कंट्रोल के भीतर एक आइटम टेम्पलेट का उपयोग करने में सक्षम हूं। हालांकि, यदि आइटम्स कंट्रोल के भीतर आइटम में से कोई एक टेक्स्टबॉक्स कहता है, तो टेक्स्टबॉक्स को आइटम्स टेम्पलेट के उदाहरण के बजाए प्रस्तुत किया जाता है। जो मैं बता सकता हूं, यह किसी भी फ्रेमवर्क एलिमेंट के लिए सच है। क्या यह आइटम्स कंट्रोल के लिए इच्छित व्यवहार है, या क्या मैं कुछ गलत तरीके से कर रहा हूं?क्यों आइटम नियंत्रण मेरे आइटम टेम्पलेट का उपयोग नहीं करता है?

एक उदाहरण:

<ItemsControl> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Grid Margin="5"> 
     <Rectangle Fill="Blue" Height="20" Width="20" /> 
     </Grid> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.Items> 
    <sys:Object /> 
    <TextBox /> 
    <sys:Object /> 
    <Rectangle Fill="Red" Height="20" Width="20" /> 
    </ItemsControl.Items> 
</ItemsControl> 

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

+0

मेरा अनुमान है कि है कि इस व्यवहार करना है, और है डेवलपर्स को विशेष वन-टाइम उपयोग नियंत्रण जोड़ने की क्षमता प्रदान करने का इरादा है। उदाहरण के लिए, मैं इसका उपयोग कॉम्बोबॉक्स में एक बटन जोड़ने के लिए कर सकता हूं जो चयन को साफ़ करता है, या मैं एक टेक्स्टबॉक्स में टेक्स्टबॉक्स डाल सकता हूं जो आइटम्ससोर्स द्वारा निर्दिष्ट संग्रह को फ़िल्टर करता है। मुझे यह सुनना अच्छा लगेगा कि इस व्यवहार के लिए किसी के पास कुछ आधिकारिक उत्तर है क्योंकि मुझे इसे आइटम टेम्पलेट के उपयोग के लिए उलझन में पाया गया है। – Drew

+0

एंथनी द्वारा महान प्रश्न और महान उत्तर, धन्यवाद दोस्तों। – Golvellius

उत्तर

12

ItemsControl एक संरक्षित सदस्य IsItemItsOwnContainerOverride जो आइटम संग्रह से एक वस्तु पारित कर दिया और true वापस लौट आता है कि पिंड एक उत्पन्न कंटेनर बिना आइटम पैनल को सीधे जोड़ा जा सकता है (और इस तरह टेम्प्लेट की जा सकती है) किया जाता है।

आधार कार्यान्वयन UIElement से प्राप्त किसी भी ऑब्जेक्ट के लिए सत्य लौटाता है।

व्यवहार प्राप्त करने के लिए आपको उम्मीद है कि आपको ItemsControl से उत्तराधिकारी होना होगा और इस विधि को ओवरराइड करना होगा और यह हमेशा झूठी वापसी करेगा। दुर्भाग्यवश इस मामले का अंत नहीं है। PrepareContainerForItemOverride के डिफ़ॉल्ट कार्यान्वयन अभी भी यदि आइटम एक UIElement ताकि आप भी इस विधि को ओवरराइड करने की आवश्यकता है कंटेनर के लिए ItemTemplate आवंटित नहीं करता है: -

protected override bool IsItemItsOwnContainerOverride(object item) 
    { 
     return false; 
    } 


    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     base.PrepareContainerForItemOverride(element, item); 
     ((ContentPresenter)element).ContentTemplate = ItemTemplate; 
    } 
+1

2015 तक, उन्होंने दूसरे भाग को तय कर दिया होगा। .NET 4.5.1 में WPF के साथ, यदि मैं 'IsItemItsOwnContainerOverride 'के लिए' झूठा 'वापस करता हूं, तो टेम्पलेट आइटम कंटेनर पर सेट होने लगते हैं। –

2

मैं बस यहां अनुमान लगा रहा हूं, लेकिन मैं शर्त लगाता हूं कि यह व्यवहार ItemContainerGenerator के अंदर रहता है। मैं शर्त लगाता हूं कि ItemContainerGenerator किसी आइटम को देखता है, और यदि यह UIElement है, तो यह कहता है, "ठंडा, आइटम कंटेनर जेनरेट किया गया है, मैं इसे वापस कर दूंगा" और यदि ऐसा नहीं है, तो यह कहता है, "मैं बेहतर उत्पन्न करूंगा इस मद के लिए एक कंटेनर। DataTemplate कहां है? "

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