2016-02-18 6 views
6

के आधार पर एक डेटा टेम्पलेट का चयन मैं निम्नलिखित प्रकार की घोषणा की है:प्रकार

public interface ITest { } 
public class ClassOne : ITest { } 
public class ClassTwo : ITest { } 

मेरी viewmodel में मैं घोषित कर रहा हूँ और निम्न संग्रह आरंभ:

public class ViewModel 
{ 
    public ObservableCollection<ITest> Coll { get; set; } = new ObservableCollection<ITest> 
    { 
     new ClassOne(), 
     new ClassTwo() 
    }; 
} 

मेरे विचार मैं में मीटर की घोषणा निम्नलिखित ItemsControl

<ItemsControl ItemsSource="{Binding Coll}"> 
    <ItemsControl.Resources> 
     <DataTemplate DataType="local:ClassOne"> 
      <Rectangle Width="50" Height="50" Fill="Red" /> 
     </DataTemplate> 
     <DataTemplate DataType="local:ClassTwo"> 
      <Rectangle Width="50" Height="50" Fill="Blue" /> 
     </DataTemplate> 
    </ItemsControl.Resources> 
</ItemsControl> 

क्या मैं देखने की उम्मीद एक लाल एक ब्लू के बाद वर्ग है

enter image description here

क्या मैं गलत कर रहा हूँ: ई वर्ग, बजाय निम्नलिखित क्या मैं देख रहा हूँ है?

+1

मैं आप वास्तव में [DataTemplateSelector] चाहने रहे हैं लगता है (https://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector%28v=vs.110%29.aspx) –

+0

@ChrisW। सीधे उस लिंक से: _ "... एक डेटा टेम्पलेट चयनकर्ता बनाएं जब आपके पास एक ही प्रकार की ऑब्जेक्ट्स के लिए एक से अधिक डेटा टेम्पलेट हों और आप प्रत्येक डेटा ऑब्जेक्ट के गुणों के आधार पर आवेदन करने के लिए डेटा टेम्पलेट चुनने के लिए अपना तर्क देना चाहते हैं। * * ध्यान दें कि यदि आपके पास विभिन्न प्रकार की ऑब्जेक्ट्स हैं तो आप DataType प्रॉपर्टी को DataTemplate ** पर सेट कर सकते हैं। "_ – kskyriacou

+0

क्षमा करें दोस्त, [ItemTemplateSelector] सोच रहा था (https://msdn.microsoft.com/en-us/library/ system.windows.controls.itemscontrol.itemtemplateselector% 28v = vs.110% 29.aspx), शायद मुझे यहां पर नहीं होना चाहिए, सर्दियों के बाद से पहला अच्छा दिन और मेरा दिमाग कहीं और है, मुझे नहीं लगता कि मैं भी वास्तव में पूरे सवाल lol देखा। वसंत बुखार, चीयर्स। –

उत्तर

7

आपकी समस्या XAML की अंतिम कार्यप्रणाली के कारण हो सकती है। विशेष रूप से, आपको Type से DataType पास करने की आवश्यकता है, लेकिन आप प्रकार के नाम से एक स्ट्रिंग पास कर रहे थे।

उपयोग x:TypeDataType का मूल्य को सजाने के लिए है, तो जैसे:

<ItemsControl ItemsSource="{Binding Coll}"> 
    <ItemsControl.Resources> 
     <DataTemplate DataType="{x:Type local:ClassOne}"> 
      <Rectangle Width="50" Height="50" Fill="Red" /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:ClassTwo}"> 
      <Rectangle Width="50" Height="50" Fill="Blue" /> 
     </DataTemplate> 
    </ItemsControl.Resources> 
</ItemsControl> 
+0

पूरी तरह से धन्यवाद काम करता है, आप घुंघराले ब्रेसिज़ को छोड़ दिया हालांकि ({x: स्थानीय टाइप करें: ClassOne})। कोई विचार क्यों मैं उपयोग कर रहा था काम नहीं कर रहा था? – kskyriacou

+1

@kyriacos_k आपका काम नहीं कर रहा था क्योंकि 'DataTemplate.DataType' प्रॉपर्टी' ऑब्जेक्ट 'प्रकार है (उदाहरण के लिए' Style.TargetType', जिसका प्रकार 'टाइप' है) का विरोध है। इसलिए 'स्थानीय: क्लासऑन' को स्ट्रिंग के रूप में व्याख्या किया जाता है और स्पष्ट रूप से 'टाइप' में परिवर्तित नहीं किया जाता है। – Clemens

+2

'x: टाइप' केवल 'टाइपऑफ()' ऑपरेटर की तरह कार्य करता है, इसलिए आप अपनी कक्षा के नाम के बजाय 'डेटा टाइप' में 'टाइप'' में प्रवेश करते हैं। - भले ही [प्रलेखन] (https://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype%28v=vs.110%29.aspx) कहता है कि यह 'ऑब्जेक्ट' और उदाहरण लेता है 'x का उपयोग नहीं करें: टाइप' –

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