datatemplate wpf c#
Diferencia entre la plantilla de control y DataTemplate en WPF (6)
¿Cuál es la diferencia entre un ControlTemplate
y un DataTemplate
en WPF?
Básicamente, un ControlTemplate
describe cómo mostrar un Control mientras que un DataTemplate
describe cómo mostrar los Datos.
Por ejemplo:
Una Label
es un control e incluirá una ControlTemplate
control que dice que la Label
debe mostrarse usando un Border
alrededor de algún contenido (una DataTemplate
u otro control).
Una clase de Customer
es Datos y se mostrará utilizando una DataTemplate
Datos que podría mostrar el Tipo de Customer
como un StackPanel
contiene dos StackPanel
uno que muestra el Nombre y el otro que muestra el número de teléfono. Podría ser útil tener en cuenta que todas las clases se muestran usando DataTemplates
, por lo general solo usará la plantilla predeterminada que es un TextBlock
con la propiedad Text
establecida en el resultado del método ToString
del objeto.
Normalmente, un control se representa por sí mismo y no refleja los datos subyacentes. Por ejemplo, un Button
no estaría vinculado a un objeto comercial; está allí puramente para poder hacer clic en él. Un ContentControl
o ListBox
, sin embargo, generalmente aparecen para que puedan presentar datos para el usuario.
Un DataTemplate
, por lo tanto, se utiliza para proporcionar una estructura visual para los datos subyacentes, mientras que ControlTemplate
no tiene nada que ver con los datos subyacentes y simplemente proporciona un diseño visual para el control en sí.
Un ControlTemplate
generalmente solo contendrá expresiones TemplateBinding
, vinculando de nuevo a las propiedades en el control mismo, mientras que un DataTemplate
contendrá expresiones de Binding estándar, vinculante a las propiedades de su DataContext
(el objeto de negocio / dominio o modelo de vista).
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>
ControlTemplate
- Cambiando la apariencia del elemento. Por ejemplo, Button
puede contener imágenes y texto
DataTemplate
: representa los datos subyacentes utilizando los elementos.
ControlTemplate
: representa el estilo de control.
DataTemplate
: representa el estilo de datos (¿Cómo le gustaría mostrar sus datos?).
Todos los controles usan una plantilla de control predeterminada que puede anular a través de la propiedad de la plantilla.
Por ejemplo
Button
plantilla del Button
es una plantilla de control. Plantilla de contenido del Button
es una plantilla de datos
<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
DEFINE la apariencia visual, DataTemplate
REEMPLAZA la apariencia visual de un elemento de datos.
Ejemplo: Quiero mostrar un botón de forma rectangular a circular => Plantilla de control.
Y si tiene objetos complejos para el control, solo llama y muestra ToString()
, con DataTemplate
puede obtener varios miembros y visualizar y cambiar sus valores del objeto de datos.