विंडोज फोन - DataTemplateSelector

इस लेख में मैं आपको बताऊंगा कि DataTemplateSelector क्या है, विंडोज फोन में अमूर्त और कस्टम DataTemplateSelector कक्षाएं कैसे बनाएं। DataTemplateSelector क्या है? एक वर्ग है जो डेटा ऑब्जेक्ट और डेटा संबंधित आइटम ( msdn ) के आधार पर डेटाटेम्पलेट के लिए चयन प्रदान करता है। दूसरे शब्दों में, यदि आपके पास एक वैध लिस्टबॉक्स है, और आप इसे प्रदर्शित करना चाहते हैं, उसी समय, विभिन्न डेटा के लिए एक से अधिक DataTemplate (प्रदर्शन शैली), तो आपको एक DataTemplateSelector का उपयोग करने की आवश्यकता है जिसके साथ आप DataTemplate को चुनने के लिए अपना तर्क बना सकते हैं। स्पष्टता के लिए, हम विचार करेंगे कि अमूर्त वर्ग को कैसे लागू किया जाए DataTemplateSelector। अब हम एक अमूर्त वर्ग बनाएंगे (जिन्हें यह नहीं पता है कि कौन सा वर्ग msdn पढ़ने के लिए सार कहलाता है) जो कि ContentCrol से प्राप्त होता है, जो वर्चुअल SelectTemplate विधि का उपयोग करके प्रदान करेगा। तदनुरूप टेम्पलेट वापस करने के लिए तर्क, और ऑनकॉन्टेंटचैन्हेड को अधिभारित करें जो आधार वर्ग से आता है।
public abstract class DataTemplateSelector : ContentControl { public virtual DataTemplate SelectTemplate(object item, DependencyObject container) { return null; } protected override void OnContentChanged(object oldContent, object newContent) { base.OnContentChanged(oldContent, newContent); ContentTemplate = SelectTemplate(newContent, this); } } 
इसके बाद, आपको एक तथाकथित "कस्टम" डेटाटेम्पलेटसेलेक्टर बनाने की आवश्यकता है जो कि डेटाटेम्प्लीसेलेटर से विरासत में मिली होगी, ताकि आप डेटाटेम्पलेट का चयन कर सकें। यहां सब कुछ सरल है।
 public class MyTemplateSelector : DataTemplateSelector { public DataTemplate Maximum { get; set; } public DataTemplate Middle { get; set; } public DataTemplate Minimum { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { var myItem = item as Data; if (myItem != null) { switch (myItem.Type) { case "Maximum": return Maximum; case "Middle": return Middle; case "Minimum": return Minimum; } } return base.SelectTemplate(item, container); } } 
अब, चलो हमारे "कस्टम" DataTemplateSelector के माध्यम से थोड़ा सा चलते हैं। यह एक नियमित वर्ग है जो DataTemplateSelector से विरासत में मिला है, यह अधिकतम, मध्य, Mimimum तीन गुणों को परिभाषित करता है जो टेम्पलेट्स का चयन करने के लिए DataTemplate हैं। इसके बाद, SelectTemplate विधि फिर से लोड की जाती है, जिसमें स्विच स्थितियां संबंधित DataTemplate को चुनने के लिए शर्तों को निर्धारित करती हैं। इसके बाद, हम एक सरल डेटा वर्ग लिखते हैं, जिसमें हमारे ListBox के डेटा को बाइंड करने के लिए गुण होंगे और हमारे स्वयं के DataTemplate के लिए अलग से कई निर्माता बना सकते हैं:
 public class Data { public string Name { get; set; } public string Description { get; set; } public string Images { get; set; } public string Type { get; set; } #region Constructor public Data(string description, string name, string images, string type) { Description = description; Name = name; Images = images; Type = type; } public Data(string description, string name, string type) { Description = description; Name = name; Type = type; } public Data(string description, string type) { Description = description; Type = type; } #endregion } 
हमने सबसे कठिन काम किया, जो हमारे लिए रहता है वह है तीन अलग-अलग टेम्पलेट्स (अधिकतम, मध्य, न्यूनतम) और हमारे "कस्टम" DataTemplateSelector के लिए एक बाइंडिंग के साथ एक लिस्टबॉक्स बनाना, और निश्चित रूप से हमारे लिस्टबॉक्स को भरें। XAML:
 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <ListBox x:Name="MyListBox"> <ListBox.ItemTemplate> <DataTemplate> <local:MyTemplateSelector> <local:MyTemplateSelector.Maximum> <DataTemplate> <StackPanel Orientation="Horizontal"> <Image Margin="8" Source="{Binding Images}" VerticalAlignment="Center" Width="48" Height="48"/> <StackPanel> <TextBlock Margin="8" Text="{Binding Name}" Width="250" VerticalAlignment="Top" HorizontalAlignment="Left"/> <TextBlock Width="100" Text="{Binding Description}" Margin="8,0,8,8" VerticalAlignment="Top" HorizontalAlignment="Left"/> </StackPanel> </StackPanel> </DataTemplate> </local:MyTemplateSelector.Maximum> <local:MyTemplateSelector.Middle> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Margin="8" Text="{Binding Name}" Width="250" VerticalAlignment="Top" HorizontalAlignment="Left" /> <TextBlock Width="250" Text="{Binding Description}" Margin="8,0,8,8" VerticalAlignment="Top" HorizontalAlignment="Left"/> </StackPanel> </DataTemplate> </local:MyTemplateSelector.Middle> <local:MyTemplateSelector.Minimum> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Margin="8" Text="{Binding Description}" Width="250" VerticalAlignment="Top" HorizontalAlignment="Left" /> </StackPanel> </DataTemplate> </local:MyTemplateSelector.Minimum> </local:MyTemplateSelector> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> 
और अंत में, डेटा के साथ भरना, इनिशियलाइज़ेशन के बाद OnNavigatedTo मेथड को जोड़ना या फिर से लोड करना संभव है, या फिर कुछ इस तरह से आता है, यह इतना महत्वपूर्ण नहीं है:
 var list = new List<Data>(); var itemData0 = new Data("Notebook", "Dell", "Assets/BrandIcon/dellIcon.jpg", "Maximum"); var itemData1 = new Data("Mouse", "Zalman", "Middle"); var itemData2 = new Data("Ultrabook", "LG", "Assets/BrandIcon/lgIcon.jpg", "Maximum"); var itemData3 = new Data("Other", "Minimum"); list.Add(itemData0); list.Add(itemData1); list.Add(itemData2); list.Add(itemData3); MyListBox.ItemsSource = list; 
बस इतना ही, आप एक साथ हमारे लिस्टबॉक्स में तीन अलग-अलग डेटाटेम्पलेट को प्रदर्शित और संकलित कर सकते हैं। यह समझने के लिए कि सब कुछ कैसे काम करता है, प्रोजेक्ट को स्वयं इकट्ठा करें, अगर यह काम नहीं करता है, तो यहां GitHub स्रोत है। लिखें, प्रयास करें, यदि आप प्रश्न पूछते हैं, तो मुझे मदद करने में खुशी होगी :)


Source: https://habr.com/ru/post/In208512/


All Articles