WPF

2009-08-27 19 views
170

में नियंत्रण टेम्पलेट और डेटा टेम्पलेट के बीच अंतर WP12 में ControlTemplate और DataTemplate के बीच क्या अंतर है?WPF

उत्तर

235

आमतौर पर एक नियंत्रण अपने स्वयं के लिए प्रदान किया जाता है, और अंतर्निहित डेटा को प्रतिबिंबित नहीं करता है। उदाहरण के लिए, Button किसी व्यावसायिक ऑब्जेक्ट से बाध्य नहीं होगा - यह पूरी तरह से है इसलिए इसे क्लिक किया जा सकता है। एक ContentControl या ListBox, हालांकि, आम तौर पर दिखाई देते हैं ताकि वे उपयोगकर्ता के लिए डेटा प्रस्तुत कर सकें।

DataTemplate, इसलिए, अंतर्निहित डेटा के लिए दृश्य संरचना प्रदान करने के लिए उपयोग किया जाता है, जबकि ControlTemplate में अंतर्निहित डेटा के साथ कुछ लेना देना नहीं है और केवल नियंत्रण के लिए दृश्य लेआउट प्रदान करता है।

एक ControlTemplate आम तौर पर केवल TemplateBinding भाव में शामिल होंगे, वापस नियंत्रण पर ही गुण के लिए बाध्य है, जबकि एक DataTemplate मानक बाध्यकारी भाव में शामिल होंगे, इसकी DataContext (व्यवसाय/डोमेन वस्तु या दृश्य मॉडल) के गुणों के लिए बाध्य।

+15

क्या यह समझ में आया? मुझे लगता है कि मैं तकनीकी लोगों की बजाय दार्शनिक मतभेदों को समझाने की कोशिश कर रहा हूं। –

100

बहुत मूल रूप से ControlTemplate बताता है कि DataTemplate डेटा को प्रदर्शित करने का वर्णन करता है, जबकि नियंत्रण को प्रदर्शित करने का तरीका बताता है।

उदाहरण के लिए:

एक Label एक नियंत्रण है और एक ControlTemplate जो Label कुछ सामग्री के चारों ओर एक Border (एक DataTemplate या किसी अन्य नियंत्रण) का उपयोग कर प्रदर्शित किया जाना चाहिए कहते हैं शामिल होंगे।

एक Customer वर्ग डाटा है और एक DataTemplate जो एक StackPanel दो TextBlocks एक नाम दिखा और अन्य फ़ोन नंबर प्रदर्शित करने वाले के रूप में Customer प्रकार प्रदर्शित करने के लिए कह सकते हैं का उपयोग कर प्रदर्शित किया जाएगा। यह ध्यान रखना उपयोगी हो सकता है कि सभी वर्ग DataTemplates का उपयोग करके प्रदर्शित होते हैं, आप आमतौर पर के साथ डिफ़ॉल्ट टेम्पलेट का उपयोग करेंगे Text संपत्ति ऑब्जेक्ट की ToString विधि के परिणामस्वरूप सेट की गई है।

6

ControlTemplate - तत्व की उपस्थिति को बदलना। उदाहरण के लिए Button में छवि और टेक्स्ट

DataTemplate - तत्वों का उपयोग करके अंतर्निहित डेटा का प्रतिनिधित्व कर सकते हैं।

17

ControlTemplate: नियंत्रण शैली का प्रतिनिधित्व करता है।

DataTemplate: डेटा शैली का प्रतिनिधित्व करता है (आप अपना डेटा कैसे दिखाना चाहते हैं)।

सभी नियंत्रण डिफ़ॉल्ट नियंत्रण टेम्पलेट का उपयोग कर रहे हैं जिन्हें आप टेम्पलेट संपत्ति के माध्यम से ओवरराइड कर सकते हैं।

उदाहरण
Button टेम्पलेट के लिए एक नियंत्रण टेम्पलेट है। Button सामग्री टेम्पलेट DataTemplate एक डेटा आइटम का दृश्य स्वरूप बदल देता

<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"); 
    } 
} 
28

Troels लार्सन MSDN forum

<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> 
+8

कोड हजारों शब्दों के लायक है –

0

ControlTemplate दृश्य उपस्थिति को परिभाषित पर एक अच्छी व्याख्या है एक डेटा टेम्पलेट है,।

उदाहरण: मैं आयताकार से सर्कल फॉर्म => नियंत्रण टेम्पलेट से एक बटन दिखाना चाहता हूं।

और यदि आपके पास नियंत्रण में जटिल वस्तुएं हैं, तो यह पर कॉल करता है और दिखाता है, DataTemplate के साथ आप विभिन्न सदस्यों को प्राप्त कर सकते हैं और डेटा ऑब्जेक्ट के अपने मूल्य प्रदर्शित और बदल सकते हैं।