Diferencia entre plantilla de control y plantilla de datos en WPF

Resuelto Firoz asked hace 15 años • 7 respuestas

¿ Cuál es la diferencia entre a ControlTemplatey a DataTemplateen WPF?

Firoz avatar Aug 27 '09 17:08 Firoz
Aceptado

Normalmente, un control se representa por sí mismo y no refleja los datos subyacentes. Por ejemplo, a Buttonno estaría vinculado a un objeto comercial; está ahí simplemente para que se pueda hacer clic en él. Un ContentControlo ListBox, sin embargo, generalmente aparecen para que puedan presentar datos al usuario.

DataTemplatePor lo tanto, A se utiliza para proporcionar una estructura visual para los datos subyacentes, mientras que a ControlTemplateno tiene nada que ver con los datos subyacentes y simplemente proporciona un diseño visual para el control en sí.

Por lo general, A ControlTemplatesolo contendrá TemplateBindingexpresiones, que se vinculan a las propiedades del control en sí, mientras que a DataTemplatecontendrá expresiones de enlace estándar, que se vinculan a las propiedades de su DataContext(el objeto de negocio/dominio o el modelo de vista).

Matt Hamilton avatar Aug 27 '2009 10:08 Matt Hamilton

Básicamente, ControlTemplatedescribe cómo mostrar un control, mientras que DataTemplatedescribe cómo mostrar datos.

Por ejemplo:

A Labeles un control e incluirá un ControlTemplateque dice que Labeldebe mostrarse usando un Borderalrededor de algún Contenido (un DataTemplateu otro Control).

Una Customerclase es Datos y se mostrará usando un, DataTemplatelo que podría decir que muestra el Customertipo como si StackPanelcontuviera dos, TextBlocksuno que muestra el nombre y el otro que muestra el número de teléfono. Puede ser útil tener en cuenta que todas las clases se muestran usando DataTemplates; normalmente usará la plantilla predeterminada, que es una TextBlockcon la Textpropiedad establecida en el resultado del ToStringmétodo del Objeto.

Bryan Anderson avatar Aug 27 '2009 14:08 Bryan Anderson

Troels Larsen tiene una buena explicación en el foro de 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>

(Plantillas descaradamente robadas de http://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate.aspx y http://msdn.microsoft.com/en-us/library/system.windows .controls.contentcontrol.contenttemplate%28VS.95%29.aspx respectivamente)

De todos modos, ControlTemplate decide cómo se ve el botón, mientras que ContentTemplate decide cómo se ve el contenido del botón. Por lo tanto, podría vincular el contenido a una de sus clases de datos y hacer que se presente como lo desee.

onmyway133 avatar Nov 18 '2012 17:11 onmyway133