2011-03-29 17 views
19

के लिए एकाधिक डेटा टेम्पलेट्स के साथ आइटम्स कंट्रोल क्या एकाधिक डेटा टेम्पलेट्स पर टेम्पलेट के रूप में कैनवास के साथ आइटम्स कंट्रोल को बाध्य करना संभव है?एक व्यूमोडेल

मेरे पास 2 संग्रह हैं और इस प्रकार के आधार पर मैं अपने कैनवास पर एक अलग नियंत्रण प्रदर्शित करना चाहता हूं।

मुझे यकीन नहीं है लेकिन मैं एक व्यूमोडेल के बारे में सोच सकता हूं जिसमें 2 पर्यवेक्षण चयन हैं। उदाहरण के लिए यदि मेरे पास "आकार" और "कनेक्शन" होंगे और मैं उन्हें दोनों कैनवास पर प्रदर्शित करना चाहता हूं? एक चित्रण परिदृश्य के मामले में ...

मैं इसे एमवीवीएम तरीके से करना चाहता हूं और मुझे यकीन नहीं है कि एकाधिक डेटा टेम्पलेट दृष्टिकोण सही है, लेकिन यह मेरे दिमाग में आया। लेकिन मुझे अभी भी सीधे मेरे सिर में बाध्यकारी पाने में समस्याएं आ रही हैं। यदि मैं डेटाकॉन्टेक्स्ट को मेरे लिए व्यूमोडेल पर सेट करता हूं तो आइटम नियंत्रण में 2 संग्रहों को बांधना संभव नहीं है ... = ( मैं अन्य विचारों के लिए भी खुला हूं ....

क्या यह संभव है? यदि हां, तो कैसे एक

+0

क्या आपको इसे WPF और Silverlight के लिए ** दोनों ** चाहिए? – Snowbear

+0

दोनों लंबे समय तक दीर्घकालिक होंगे ... लेकिन पहला WPF बहुत अच्छा होगा ... – silverfighter

+0

डेटा टेम्पलेट चयनकर्ता 'डब्ल्यूपीएफ' और 'सिल्वरलाइट' दोनों के लिए काम करेगा। – vorrtex

उत्तर

41

आप कई ObservableCollections बना सकते हैं और फिर ItemsSource को CompositeCollection पर जोड़ सकते हैं जो उन संग्रहों में शामिल हो जाता है।

फिर अपने एक्सएएमएल में आप विभिन्न प्रकार के DataTemplates को DataType संपत्ति का उपयोग करके संबंधित प्रकारों के लिए बना सकते हैं, जैसे कि संसाधनों में शैलियों को स्वचालित रूप से लागू किया जाता है।

ObservableCollection<Employee> data1 = new ObservableCollection<Employee>(new Employee[] 
{ 
    new Employee("Hans", "Programmer"), 
    new Employee("Elister", "Programmer"), 
    new Employee("Steve", "GUI Designer"), 
    new Employee("Stefan", "GUI Designer"), 
    new Employee("Joe", "Coffee Getter"), 
    new Employee("Julien", "Programmer"), 
}); 
ObservableCollection<Machine> data2 = new ObservableCollection<Machine>(new Machine[] 
{ 
    new Machine("E12", "GreedCorp"), 
    new Machine("E11", "GreedCorp"), 
    new Machine("F1-MII", "CommerceComp"), 
    new Machine("F2-E5", "CommerceComp") 
}); 
CompositeCollection coll = new CompositeCollection(); 
coll.Add(new CollectionContainer() { Collection = data1 }); 
coll.Add(new CollectionContainer() { Collection = data2 }); 
Data = coll; 
<ItemsControl ItemsSource="{Binding Data}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.Resources> 
     <DataTemplate DataType="{x:Type local:Employee}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Name}"/> 
       <TextBlock Text=" ("/> 
       <TextBlock Text="{Binding Occupation}"/> 
       <TextBlock Text=")"/> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:Machine}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Model}"/> 
       <TextBlock Text=" - "/> 
       <TextBlock Text="{Binding Manufacturer}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.Resources> 
</ItemsControl> 

यहाँ मैं एक अलग का उपयोग करें:

उदाहरण कोड (आप भी XAML में समग्र जो MSDN पर दिखाया गया है बना सकते हैं CollectionContainers बाध्य किया जाना चाहिए कि हालांकि a bit more difficult है) पैनल लेकिन यह कैनवास के लिए समान होना चाहिए।

+0

धन्यवाद, समग्र संयोजन के बारे में नहीं पता था ... – silverfighter

2

तरह बंधन नज़र डाटा टेम्पलेट चयनकर्ता पर एक नज़र डालें होगा:।। here या here

5

आप अपने ViewModel में ObservableCollection<object> है और इस संग्रह के ItemsControl के स्रोत के लिए बाध्य कर सकता है

था एन, विभिन्न प्रकार के डेटा के लिए एक अलग रूप देखने के लिए, आप एक्स: कुंजी के बिना दो डेटा टेम्पलेट्स कर सकते हैं, लेकिन अपने संसाधनों में डेटा टाइप टाइप कर सकते हैं। आइटम्स कंट्रोल तब स्वचालित रूप से आपके आइटम के लिए उपयुक्त डेटा टेम्पलेट का चयन करेगा।

-4

कम कोड वाला दूसरा विकल्प दो सूची बॉक्स को परिभाषित करना होगा, प्रत्येक अपने स्वयं के टेम्पलेट्स के साथ और अपने स्वयं के संग्रह से बंधेगा। उन्हें एक ही भौतिक स्थान में परिभाषित करें और बस अपने राज्य के आधार पर कौन सा दिखाई दे रहा है उसे नियंत्रित करें। आप इसे विजुअल स्टेट मैनेजर और कस्टम स्टेटस के साथ भी कर सकते हैं।

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