xaml
डेटा टेम्प्लेट
खोज…
एक ListBox में DataTemplate का उपयोग करना
मान लें कि हमारे पास निम्नलिखित XAML स्निपेट है:
<ListBox x:Name="MyListBox" />
फिर इस XAML फ़ाइल के कोड-पीछे में, हम कंस्ट्रक्टर में निम्नलिखित लिखते हैं:
MyListBox.ItemsSource = new[]
{
1, 2, 3, 4, 5
};
एप्लिकेशन को चलाने पर, हमें दर्ज किए गए नंबरों की एक सूची मिलती है।
हालांकि, अगर हम इस तरह की एक कस्टम प्रकार की वस्तुओं की सूची प्रदर्शित करने की कोशिश करते हैं
MyListBox.ItemsSource = new[]
{
new Book { Title = "The Hitchhiker's Guide to the Galaxy", Author = "Douglas Adams" },
new Book { Title = "The Restaurant at the End of the Universe", Author = "Douglas Adams" },
new Book { Title = "Life, the Universe and Everything", Author = "Douglas Adams" },
new Book { Title = "So Long, and Thanks for All the Fish", Author = "Douglas Adams" },
new Book { Title = "Mostly Harmless", Author = "Douglas Adams" }
};
यह मानते हुए कि हमारे पास Book नामक एक क्लास है
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
तब सूची कुछ इस तरह दिखाई देगी:
हालांकि हम मान सकते हैं कि लिस्टबॉक्स हमारी किताब की वस्तुओं को सही प्रदर्शित करने के लिए "स्मार्ट पर्याप्त" होगा, जो हम वास्तव में देखते हैं वह Book प्रकार का पूरा नाम है। लिस्टबॉक्स वास्तव में यहां क्या करता है, इसमें निर्मित वस्तुओं पर निर्मित ToString() विधि को कॉल करना है जिसे वह प्रदर्शित करना चाहता है, और जबकि संख्याओं के मामले में वांछनीय परिणाम उत्पन्न करता है, कस्टम क्लासेस की वस्तुओं पर ToString() कॉल करने का परिणाम मिलता है स्क्रीनशॉट पर देखा गया उनका प्रकार।
हम अपनी पुस्तक कक्षा के लिए ToString() लिखकर इसे हल कर सकते हैं
public override string ToString()
{
return Title;
}
हालाँकि, यह बहुत लचीला नहीं है। क्या होगा अगर हम लेखक को भी प्रदर्शित करना चाहते हैं? हम लिख सकते हैं कि ToString भी, लेकिन क्या होगा अगर हम ऐप में सभी सूचियों में नहीं चाहते हैं? कैसे प्रदर्शित करने के लिए एक अच्छी पुस्तक कवर के बारे में?
वह जगह जहां DataTemplates मदद कर सकता है। वे एक्सएएमएल के स्निपेट हैं जिन्हें आवश्यकतानुसार "त्वरित" किया जा सकता है, वे उस स्रोत डेटा के अनुसार विवरणों से भरे होते हैं जिनके लिए उन्हें बनाया गया है। सीधे शब्दों में कहें, अगर हम अपना लिस्टबॉक्स कोड इस प्रकार बढ़ाते हैं:
<ListBox x:Name="MyListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
तब सूची अपने स्रोत में प्रत्येक आइटम के लिए एक TextBox बनाएगी, और उन टेक्स्टबॉक्स में हमारी वस्तुओं के Title गुण से मानों के साथ " Text गुण" भरा होगा।
यदि हम अभी एप्लिकेशन चलाते हैं, तो हमें ऊपर के रूप में एक ही आउटपुट मिलता है, * भले ही हम कस्टम ToString कार्यान्वयन को हटा दें। इसके बारे में क्या फायदेमंद है कि हम इस टेम्पलेट को एक साधारण string (और ToString ) की क्षमताओं से परे अच्छी तरह से अनुकूलित कर सकते हैं। हम किसी भी एक्सएएमएल तत्व का उपयोग कर सकते हैं, जिसे हम चाहते हैं, जिसमें कस्टम भी शामिल हैं, और हमारे मूल्यों से वास्तविक डेटा के लिए उनके मूल्यों को "बाइंड" कर सकते हैं (जैसे ऊपर उदाहरण में Title )। उदाहरण के लिए, टेम्पलेट को निम्नानुसार विस्तारित करें:
<ListBox x:Name="MyListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock FontStyle="Italic" Text="{Binding Author}" />
<TextBlock FontSize="18" Text="{Binding Title}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
तब हमें अपनी किताबों का एक अच्छा स्वरूप दिखाई देता है!



