जवाबों:
आमतौर पर एक नियंत्रण अपने स्वयं के लिए प्रदान किया जाता है, और अंतर्निहित डेटा को प्रतिबिंबित नहीं करता है। उदाहरण के लिए, एक Button
व्यावसायिक वस्तु के लिए बाध्य नहीं होगा - यह विशुद्ध रूप से है इसलिए इसे क्लिक किया जा सकता है। ए ContentControl
या ListBox
, हालांकि, आम तौर पर दिखाई देते हैं ताकि वे उपयोगकर्ता के लिए डेटा प्रस्तुत कर सकें।
एक DataTemplate
है, इसलिए, डेटा अंतर्निहित के लिए दृश्य संरचना प्रदान करने के लिए थोड़ी देर के लिए किया जाता है ControlTemplate
अंतर्निहित डेटा के साथ कोई संबंध नहीं है और बस नियंत्रण के लिए ही दृश्य लेआउट प्रदान करता है।
A ControlTemplate
में आम तौर पर केवल TemplateBinding
अभिव्यक्ति होती है, जो गुणों को नियंत्रण पर वापस बांधती है, जबकि एक DataTemplate
में मानक बाइंडिंग अभिव्यक्तियाँ होंगी, इसके गुणों DataContext
(व्यवसाय / डोमेन ऑब्जेक्ट या दृश्य मॉडल) के लिए बाध्य होगी ।
बहुत मूल रूप से डेटा को प्रदर्शित करने के तरीके का ControlTemplate
नियंत्रण करते समय नियंत्रण DataTemplate
प्रदर्शित करने का तरीका बताता है।
उदाहरण के लिए:
A Label
एक नियंत्रण है और इसमें एक सामग्री शामिल होगी ControlTemplate
जो कहती है कि कुछ सामग्री ( या एक अन्य नियंत्रण) Label
का उपयोग करके प्रदर्शित किया जाना चाहिए ।Border
DataTemplate
एक Customer
वर्ग डेटा है और इसका उपयोग करके प्रदर्शित किया जाएगा DataTemplate
जो कि Customer
टाइप को प्रदर्शित करने के लिए कह सकता है StackPanel
जिसमें TextBlocks
एक दो का नाम और दूसरा फोन नंबर प्रदर्शित करता है। यह ध्यान रखना उपयोगी हो सकता है कि सभी वर्गों का उपयोग करके प्रदर्शित किया जाता है DataTemplates
, आप आमतौर पर डिफ़ॉल्ट टेम्पलेट का उपयोग करेंगे जो कि ऑब्जेक्ट के विधि के परिणाम के लिए सेट संपत्ति के TextBlock
साथ है ।Text
ToString
ट्रॉल्स लार्सन की MSDN फोरम पर अच्छी व्याख्या है
<Window x:Class="WpfApplication7.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <DataTemplate x:Key="ButtonContentTemplate"> <StackPanel Orientation="Horizontal"> <Grid Height="8" Width="8"> <Path HorizontalAlignment="Stretch" Margin="0,0,1.8,1.8" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FF000000" Data="M0.5,5.7 L0.5,0.5 L5.7,0.5"/> <Path HorizontalAlignment="Stretch" Margin="2,3,0,0" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FFFFFFFF" Data="M3.2,7.5 L7.5,7.5 L7.5,3.5"/> <Path HorizontalAlignment="Stretch" Margin="1.2,1.4,0.7,0.7" VerticalAlignment="Stretch" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Data="M2.5,2.5 L7.5,7.5"/> <Path HorizontalAlignment="Stretch" Margin="1.7,2.0,1,1" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FF000000" Data="M3,7.5 L7.5,7.5 L7.5,3.5"/> <Path HorizontalAlignment="Stretch" Margin="1,1,1,1" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FFFFFFFF" Data="M1.5,6.5 L1.5,1 L6.5,1.5"/> </Grid> <ContentPresenter Content="{Binding}"/> </StackPanel> </DataTemplate> <ControlTemplate TargetType="Button" x:Key="ButtonControlTemplate"> <Grid> <Ellipse Fill="{TemplateBinding Background}"/> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </ControlTemplate> </Window.Resources> <StackPanel> <Button Template="{StaticResource ButtonControlTemplate}" ContentTemplate="{StaticResource ButtonContentTemplate}" Content="1"/> <Button Template="{StaticResource ButtonControlTemplate}" ContentTemplate="{StaticResource ButtonContentTemplate}" Content="2"/> <Button Template="{StaticResource ButtonControlTemplate}" ContentTemplate="{StaticResource ButtonContentTemplate}" Content="3"/> </StackPanel> </Window>
(अस्थायी रूप से http://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate.aspx और http://msdn.microsoft.com/en-us/library/cystem/windows से चोरी किए गए टेम्पलेट .controls.contentcontrol.contenttemplate% 28VS.95% 29.aspx क्रमशः)
वैसे भी, ControlTemplate तय करता है कि बटन कैसे दिखता है, जबकि ContentTemplate यह तय करता है कि बटन की सामग्री कैसी दिखती है। तो आप सामग्री को आप में से किसी एक डेटा वर्ग से बाँध सकते हैं और इसे स्वयं प्रस्तुत कर सकते हैं, हालाँकि आप इसे चाहते थे।
ControlTemplate
: रिप्रेजेंटेंट्स कंट्रोल स्टाइल।
DataTemplate
: डेटा शैली का प्रतिनिधित्व करता है (आप अपना डेटा कैसे दिखाना चाहेंगे)।
सभी नियंत्रण डिफ़ॉल्ट नियंत्रण टेम्पलेट का उपयोग कर रहे हैं जिसे आप टेम्पलेट संपत्ति के माध्यम से ओवरराइड कर सकते हैं।
उदाहरण के लिए
Button
टेम्पलेट एक नियंत्रण टेम्पलेट है।
Button
सामग्री टेम्पलेट एक डेटा टेम्पलेट है
<Button VerticalAlignment="Top" >
<Button.Template>
<ControlTemplate >
<Grid>
<Rectangle Fill="Blue" RadiusX="20" RadiusY="20"/>
<Ellipse Fill="Red" />
<ContentPresenter Content="{Binding}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="50">
<TextBlock Text="Name" Margin="5"/>
<TextBox Text="{Binding UserName, Mode=TwoWay}" Margin="5" Width="100"/>
<Button Content="Show Name" Click="OnClickShowName" />
</StackPanel>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
public String UserName
{
get { return userName; }
set
{
userName = value;
this.NotifyPropertyChanged("UserName");
}
}
ControlTemplate
दृश्य उपस्थिति को DataTemplate
परिभाषित करता है , किसी डेटा आइटम के दृश्य स्वरूप को दिखाता है।
उदाहरण: मैं आयताकार से वृत्त रूप => नियंत्रण टेम्पलेट का एक बटन दिखाना चाहता हूं।
और अगर आपके पास नियंत्रण के लिए जटिल ऑब्जेक्ट हैं, तो यह सिर्फ कॉल और शो करता है ToString()
, DataTemplate
आप विभिन्न सदस्यों को प्राप्त कर सकते हैं और डेटा ऑब्जेक्ट के अपने मूल्यों को प्रदर्शित और बदल सकते हैं।
उपरोक्त सभी उत्तर महान हैं लेकिन एक महत्वपूर्ण अंतर है जो याद किया गया था। इसका उपयोग करने के बारे में बेहतर निर्णय लेने में मदद करता है। यह ItemTemplate
संपत्ति है:
DataTemplate का उपयोग उन तत्वों के लिए किया जाता है , जो आपके द्वारा आइटम का उपयोग करने के लिए ItemTemplate संपत्ति प्रदान करते हैं , DataTemplate
जो आपके द्वारा प्रदान किए गए चयनकर्ता के माध्यम से बाध्य डेटा के अनुसार पहले परिभाषित करते हैं।
लेकिन अगर आपका नियंत्रण आपके लिए यह विलासिता प्रदान नहीं करता है, तो आप अभी भी इसका उपयोग कर सकते हैं जो ContentView
पूर्वनिर्धारित से इसकी सामग्री प्रदर्शित कर सकता है ControlTemplate
। दिलचस्प बात यह है कि आप रनटाइम ControlTemplate
में अपनी संपत्ति को बदल सकते हैं ContentView
। एक और बात ध्यान दें कि ItemTemplate
संपत्ति के नियंत्रण के विपरीत , आपके पास इसके TemplateSelector
लिए नहीं हो सकता है (ContentView) नियंत्रण। हालाँकि, आप अभी भी ControlTemplate
रनटाइम में बदलाव के लिए ट्रिगर बना सकते हैं ।