控件模板和WPF中的DataTemplate之间的差异

WPF中的ControlTemplateDataTemplate有什么不同?

通常情况下,控件是为了自己的目的而呈现的,并不反映底层的数据。 例如,一个Button不会被绑定到一个业务对象 – 它只是在那里被点击而已。 但是, ContentControlListBox通常显示为可以为用户显示数据。

因此, DataTemplate用于为底层数据提供可视结构,而ControlTemplate与底层数据无关,仅为控件本身提供了可视布局。

一个ControlTemplate通常只包含TemplateBindingexpression式,绑定回控件本身的属性,而DataTemplate将包含标准的绑定expression式,绑定到其DataContext (业务/域对象或视图模型)的属性。

非常基本的一个ControlTemplate描述了如何显示一个控件,而DataTemplate描述了如何显示数据。

例如:

一个Label是一个控件,将包含一个ControlTemplate ,它表示Label应该使用围绕某些内容( DataTemplate或其他控件)的Border显示。

Customer类是数据,并将显示使用DataTemplate可以说,显示Customertypes为一个StackPanel包含两个TextBlocks一个显示名称和另一个显示电话号码。 注意到所有的类都使用DataTemplates显示可能会有所帮助,您通常只需使用TextBlock的默认模板,将Text属性设置为Object的ToString方法的结果。

Troels Larsen在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 :表示控件样式。

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

ControlTemplate – 更改元素的外观。 例如Button可以包含图像和文本

DataTemplate – 使用元素表示底层数据。

ControlTemplate定义可视外观, DataTemplatereplace数据项的可视外观。

例如:我想显示一个从矩形到圆形的button=>控制模板。

如果你有复杂的控件对象,它只是调用并显示ToString() ,用DataTemplate你可以得到不同的成员,并显示和改变它们的数据对象的值。