2016-01-21 11 views
8

मैंने बहुत समय पहले एक छोटा डब्ल्यूपीएफ प्रोग्रामिंग किया था, लेकिन मैं सिर्फ यूडब्लूपी के साथ एक्सएमएल पर लौट रहा हूं, लेकिन मुझे लगता है कि यह काम करना चाहिए और क्यों नहीं समझ सकता। मूल रूप से मैं ListView नियंत्रण के बजाय आइटम्स कंट्रोल (क्योंकि मैं बस कुछ डेटा सूचीबद्ध करना चाहता हूं, मैं चयन नहीं चाहता हूं) का उपयोग करना चाहता हूं। यहाँ मेरी संसाधन हैं:विंडोज 10 यूडब्ल्यूपी ऐप में आइटम कंट्रोल और आइटम टेम्पलेट चयनकर्ता

<Page.Resources> 
    <DataTemplate x:Key="SentMessageDataTemplate"> 
     <TextBlock Text="Sent" /> 
    </DataTemplate> 
    <DataTemplate x:Key="ReceivedMessageDataTemplate"> 
     <TextBlock Text="Recieved" /> 
    </DataTemplate> 
    <services:MessageDataTemplateSelector x:Key="MessageDataTemplateSelector" ReceivedTemplate="{StaticResource ReceivedMessageDataTemplate}" SentTemplate="{StaticResource SentMessageDataTemplate}"></services:MessageDataTemplateSelector> 
</Page.Resources> 

यहाँ मेरी ItemsControl है:

<ItemsControl ItemsSource="{Binding Messages}" ItemTemplateSelector="{StaticResource MessageDataTemplateSelector}" /> 

यहाँ मेरी DataTemplateSelector है:

public class MessageDataTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate SentTemplate 
    { 
     get; 
     set; 
    } 

    public DataTemplate ReceivedTemplate 
    { 
     get; 
     set; 
    } 

    protected override DataTemplate SelectTemplateCore(object item) 
    { 
     var message = item as MessageViewModel; 
     if (message == null) 
     { 
      return this.SentTemplate; 
     } 

     return message.Sent ? this.SentTemplate : this.ReceivedTemplate; 
    } 
} 

के बजाय मेरे टेम्पलेट के दोनों प्रदर्शित यह सिर्फ मेरी ViewModel प्रकार नाम प्रदर्शित करता है (इसलिए मूल रूप से ToString)।

हालांकि अगर मैं इसे आइटम नियंत्रण से ListView में स्विच करता हूं, तो यह ठीक काम करता है।

कोई सुझाव?

+0

हाल ही में मेरे ऐप्स में से एक में एक ही समस्या थी! आश्चर्य है कि यह सुलभ है ... – Depechie

उत्तर

9

उपयोग इस ओवरराइड बजाय:

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 

यह एक कहा जाता हो जाता है कि, 2 पैरामीटर के बिना एक नहीं है।

+0

मैंने कोशिश की, कोई भाग्य नहीं।ItemPanelTemplate डिफ़ॉल्ट टेम्पलेट के समान है। यह ठीक काम करता है अगर मैं कोई आइटम टेम्पलेट सेट करता हूं, तो यह आइटम टेम्पलेट चयनकर्ता पसंद नहीं करता है। – Cleverguy25

+0

मैंने अपना जवाब अपडेट किया। 1 परम के साथ ओवरराइड कभी नहीं कहा जाता है (जैसा आपने देखा)। 2 उपलब्ध हैं। मुश्किल। –

0

शायद आपको <TextBlock Text="{Binding Sent}" /> का उपयोग करना चाहिए, आप अपने टेम्पलेट में कुछ भी बाध्य नहीं करते हैं।

+0

भले ही मैं कुछ बांधता हूं, यह काम नहीं करता है। ListView कुछ भी बाध्यकारी के बिना भी काम करता है। यदि मैं अपने डेटा टेम्पलेट चयनकर्ता में ब्रेकपॉइंट सेट करता हूं तो इसे आइटम्स कंट्रोल में चलाने पर कभी भी कॉल नहीं किया जाता है। मुझे लगता है कि यह सिर्फ एक बग है। – Cleverguy25

5

दिलचस्प - ListView और GridView दोनों टेम्पलेट चयनकर्ता का आह्वान करते हैं; सादा आइटम नियंत्रण या Listbox नहीं है।

टेम्पलेट चयनकर्ता में अन्य SelectTemplateCore विधि ओवरराइड करना, में मदद करता है, उदा .:

protected override DataTemplate SelectTemplateCore(object item) 
{ 
    var message = item as MessageViewModel; 
    if (message == null) 
    { 
     return SentTemplate; 
    } 

    return message.Sent ? SentTemplate : ReceivedTemplate; 
} 

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 
{ 
    return SelectTemplateCore(item); 
} 

बाद विधि सभी मामलों में कहा जाता है; पहले ItemsControl वस्तुओं के लिए नहीं कहा जाता है। This page प्रकार का एक स्पष्टीकरण प्रदान:

यदि आपका ItemsControl.ItemsPanel एक ItemsStackPanel या ItemsWrapGrid है, SelectTemplateCore(Object) विधि के लिए एक ओवरराइड प्रदान करते हैं। यदि ItemsPanel एक अलग पैनल है, जैसे कि VirtualizingStackPanel या WrapGrid, SelectTemplateCore(Object, DependencyObject) विधि के लिए ओवरराइड प्रदान करें।

+0

कोरी ने आपको कुछ मिनटों तक हरा दिया, लेकिन दस्तावेज़ीकरण के लिए आपका लिंक उपयोगी था। – Cleverguy25

0

यहाँ प्रलेखन का कहना है:

टिप्पणियां

यदि आपका ItemsControl.ItemsPanel एक ItemsStackPanel या ItemsWrapGrid है, SelectTemplateCore (वस्तु) विधि के लिए एक ओवरराइड प्रदान करते हैं। यदि आइटम्सपैनेल एक अलग पैनल है, जैसे वर्चुअलाइजिंगस्टैकपैनल या रैपग्रिड, SelectTemplateCore (ऑब्जेक्ट, निर्भरता ऑब्जेक्ट) विधि के लिए ओवरराइड प्रदान करें।

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