Diferencia entre plantilla de control y plantilla de datos en WPF
¿ Cuál es la diferencia entre a ControlTemplate
y a DataTemplate
en WPF?
Normalmente, un control se representa por sí mismo y no refleja los datos subyacentes. Por ejemplo, a Button
no estaría vinculado a un objeto comercial; está ahí simplemente para que se pueda hacer clic en él. Un ContentControl
o ListBox
, sin embargo, generalmente aparecen para que puedan presentar datos al usuario.
DataTemplate
Por lo tanto, A se utiliza para proporcionar una estructura visual para los datos subyacentes, mientras que a ControlTemplate
no tiene nada que ver con los datos subyacentes y simplemente proporciona un diseño visual para el control en sí.
Por lo general, A ControlTemplate
solo contendrá TemplateBinding
expresiones, que se vinculan a las propiedades del control en sí, mientras que a DataTemplate
contendrá expresiones de enlace estándar, que se vinculan a las propiedades de su DataContext
(el objeto de negocio/dominio o el modelo de vista).
Básicamente, ControlTemplate
describe cómo mostrar un control, mientras que DataTemplate
describe cómo mostrar datos.
Por ejemplo:
A Label
es un control e incluirá un ControlTemplate
que dice que Label
debe mostrarse usando un Border
alrededor de algún Contenido (un DataTemplate
u otro Control).
Una Customer
clase es Datos y se mostrará usando un, DataTemplate
lo que podría decir que muestra el Customer
tipo como si StackPanel
contuviera dos, TextBlocks
uno 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 TextBlock
con la Text
propiedad establecida en el resultado del ToString
método del Objeto.
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.