WPF में कंट्रोल टेम्प्लेट और डेटाटेम्पलेट के बीच अंतर


जवाबों:


267

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

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

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


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

110

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

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

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

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


विवरण की सादगी के लिए मतदान किया। बहुत सराहना की।
पीट मैग्सिग

31

ट्रॉल्स लार्सन की 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 यह तय करता है कि बटन की सामग्री कैसी दिखती है। तो आप सामग्री को आप में से किसी एक डेटा वर्ग से बाँध सकते हैं और इसे स्वयं प्रस्तुत कर सकते हैं, हालाँकि आप इसे चाहते थे।


19

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

7

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

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


1

ControlTemplateदृश्य उपस्थिति को DataTemplateपरिभाषित करता है , किसी डेटा आइटम के दृश्य स्वरूप को दिखाता है।

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

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


0

उपरोक्त सभी उत्तर महान हैं लेकिन एक महत्वपूर्ण अंतर है जो याद किया गया था। इसका उपयोग करने के बारे में बेहतर निर्णय लेने में मदद करता है। यह ItemTemplateसंपत्ति है:

  • DataTemplate का उपयोग उन तत्वों के लिए किया जाता है , जो आपके द्वारा आइटम का उपयोग करने के लिए ItemTemplate संपत्ति प्रदान करते हैं , DataTemplateजो आपके द्वारा प्रदान किए गए चयनकर्ता के माध्यम से बाध्य डेटा के अनुसार पहले परिभाषित करते हैं।

  • लेकिन अगर आपका नियंत्रण आपके लिए यह विलासिता प्रदान नहीं करता है, तो आप अभी भी इसका उपयोग कर सकते हैं जो ContentViewपूर्वनिर्धारित से इसकी सामग्री प्रदर्शित कर सकता है ControlTemplate। दिलचस्प बात यह है कि आप रनटाइम ControlTemplateमें अपनी संपत्ति को बदल सकते हैं ContentView। एक और बात ध्यान दें कि ItemTemplateसंपत्ति के नियंत्रण के विपरीत , आपके पास इसके TemplateSelectorलिए नहीं हो सकता है (ContentView) नियंत्रण। हालाँकि, आप अभी भी ControlTemplateरनटाइम में बदलाव के लिए ट्रिगर बना सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.