2010-10-30 23 views
31

मैं बस निम्नलिखित परिदृश्य को समझना चाहता हूं। कहाँ मैं एक ObservableCollection<TabViewModel>डब्ल्यूपीएफ: टैबकंट्रोल और डेटा टेम्पलेट्स

कोई डेटा टेम्पलेट्स के लिए एक <TabControl> बाध्य को लागू कर रहा हूँ

मैं किसी भी DataTemplate रों की जरूरत नहीं है जब, पाठ WpfApplication1.TabViewModel टैब शीर्ष लेख और सामग्री में प्रकट होता है। ठीक है मैं इस भाग को समझता हूँ।

बस ItemTemplate

जब मैं सिर्फ

<TabControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding TabTitle}" /> 
     </StackPanel> 
    </DataTemplate> 
</TabControl.ItemTemplate> 

तब मेरे टैब हैडर भर जाता है की है। टैब सामग्री अभी भी WpfApplication1.TabViewModel है।

बस DataTemplate

जब मैं बस नीचे दिए गए है मेरी <Window.Resources>

<DataTemplate DataType="{x:Type local:TabViewModel}"> 
    <TextBox Text="{Binding Text}" /> 
</DataTemplate> 

टेम्पलेट्स टैब हैडर भरता है कि में।

दोनों

जब मैं दोनों है, ItemTemplate टैब हैडर भरता है, जबकि DataTemplate टैब सामग्री को भरती है। यह सब अंतर क्यों है। ItemTemplate & DataTemplate टैब हेडर भरता है यदि दूसरा मौजूद नहीं है। यदि दोनों मौजूद हैं, ItemTemplate शीर्षलेख भरता है जबकि DataTemplate सामग्री भरता है।

हालांकि मेरे पास काम करने वाली चीजें हैं, मैं काफी उलझन में हूं। <TabControl.HeaderTemplate> जैसे कुछ नहीं होना चाहिए जो हेडर भरता है और <TabControl.ItemTemplate> सामग्री भरें?

उत्तर

50

सबसे पहले, वहाँ दो यहाँ शामिल टेम्प्लेट उपलब्ध हैं:

  • TabControl.ItemTemplate, TabItem हेडर
  • TabControl.ContentTemplate, TabItem सामग्री

रेंडर करने के लिए प्रयोग किया जाता है रेंडर करने के लिए प्रयोग किया जाता है, तो आप डॉन ' इन गुणों को स्पष्ट रूप से सेट नहीं करते हैं तो WPF उन्हें कहीं और हल करने का प्रयास करेगा। यह लॉजिकल पेड़ को एक संसाधन की तलाश करेगा जो यह बताएगा कि आपका व्यू मॉडल कैसे प्रस्तुत किया जाए। अगर इसे DataTemplate मिलता है जिसमें मिलान DataType है लेकिन कोई कुंजी नहीं है, तो यह दृश्य मॉडल को प्रस्तुत करने के लिए इसका उपयोग करेगा। यदि यह एक नहीं मिलता है, तो यह ऑब्जेक्ट के ToString मान को प्रस्तुत करने के लिए डिफ़ॉल्ट होगा।

<TabControl ItemsSource="{Binding Tabs}"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding TabTitle}"/> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}"/> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

जब से तुम विशिष्ट नहीं किया जा रहा हो, WPF एक उपयुक्त DataTemplate खोजने के लिए अपने तार्किक पेड़ पर चलने के लिए प्रयास कर रहा है:

इसलिए, यदि आप स्पष्ट होना चाहता हूँ, आप कुछ इस तरह करना चाहते हैं। जब इसे पाता है, तो यह दृश्य मॉडल प्रस्तुत करने के लिए इसका उपयोग करता है।जहां इसे नहीं मिला, यह ToString पर कॉल करता है और इसे प्रस्तुत करता है।

तो अपने विशिष्ट मामलों का समाधान करने के:

बस ItemTemplate

आप स्पष्ट रूप से टैब हेडर नहीं बल्कि टैब सामग्री प्रस्तुत करने के लिए कैसे कहा गया है। तो पूर्व प्रदान किए गए DataTemplate का उपयोग करके प्रस्तुत किया जाता है, लेकिन बाद वाला ToString पर डिफ़ॉल्ट होगा।

बस DataTemplate

आप स्पष्ट रूप से कैसे किसी भी टैब हेडर या टैब सामग्री प्रस्तुत करने के लिए नहीं कहा गया है। इसलिए, डब्ल्यूपीएफ दोनों के लिए उचित DataTemplate की खोज करता है। चूंकि दोनों में आपके व्यू मॉडल का उदाहरण है (यह उनका DataContext है) तो उसी DataTemplate टैब हेडर और उनकी सामग्री को प्रस्तुत करने के लिए उपयोग किया जाएगा।

नोट: आपने स्पष्ट रूप से यह नहीं बताया कि यह आपके प्रश्न में क्या हो रहा है। यदि मैं गलत हूं तो मुझे सही करों।

दोनों

इस मामले में, आप स्पष्ट रूप से टैब हेडर नहीं बल्कि टैब सामग्री प्रस्तुत करने के लिए कैसे कहा गया है। इसलिए, स्पष्ट DataTemplate टैब हेडर के लिए उपयोग किया जाता है और निहित DataTemplate टैब सामग्री के लिए उपयोग किया जाता है।

+0

यदि मैं सामग्री और टैब नियंत्रण आइटम स्रोत के साथ सूची बॉक्स चाहता हूं तो सूची बॉक्स के लिए आइटम सूची होगी..मैं इसके लिए क्या कर सकता हूं? सूची बॉक्स में डेटा टेम्पलेट भी स्वयं – Programmer

+0

है "सबसे पहले, यहां दो टेम्पलेट शामिल हैं ..." Argh! आपको लगता है कि जिस तरह से आप DataTemplate के बाहर TabItem निर्दिष्ट करते हैं, वह TabControl ItemTemplate प्रॉपर्टी में वही काम करता है, क्योंकि ListView et al। इस तरह से काम करो। धन्यवाद! – user1454265

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