在WPF中控制模板和数据模板之间的区别是什么?
当前回答
通常情况下,控件是为其本身而呈现的,并不反映底层数据。例如,一个Button不会被绑定到业务对象上——它的存在纯粹是为了可以被点击。然而,ContentControl或ListBox通常出现,以便为用户显示数据。
因此,DataTemplate用于为底层数据提供可视化结构,而ControlTemplate与底层数据无关,只是为控件本身提供可视化布局。
一个ControlTemplate通常只包含TemplateBinding表达式,绑定回控件本身的属性,而一个DataTemplate将包含标准binding表达式,绑定到它的DataContext(业务/域对象或视图模型)的属性。
其他回答
通常情况下,控件是为其本身而呈现的,并不反映底层数据。例如,一个Button不会被绑定到业务对象上——它的存在纯粹是为了可以被点击。然而,ContentControl或ListBox通常出现,以便为用户显示数据。
因此,DataTemplate用于为底层数据提供可视化结构,而ControlTemplate与底层数据无关,只是为控件本身提供可视化布局。
一个ControlTemplate通常只包含TemplateBinding表达式,绑定回控件本身的属性,而一个DataTemplate将包含标准binding表达式,绑定到它的DataContext(业务/域对象或视图模型)的属性。
ControlTemplate:表示控件样式。
DataTemplate:表示数据样式(您希望如何显示数据)。
所有控件都使用可以通过template属性重写的默认控件模板。
例如 按钮模板是控件模板。 按钮内容模板是一个数据模板
<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");
}
}
以上所有的答案都很棒,但有一个关键的区别被忽略了。这有助于更好地决定何时使用什么。它是ItemTemplate属性:
DataTemplate is used for elements that provide ItemTemplate property for you to replace its items' content using DataTemplates you define previously according to bound data through a selector that you provide. But if your control does not provide this luxury for you then you still can use a ContentView that can display its content from predefined ControlTemplate. Interestingly, you can change the ControlTemplate property of your ContentView at runtime. One more thing to note that unlike controls with ItemTemplate property, you cannot have a TemplateSelector for this (ContentView) control. However, you still can create triggers to change the ControlTemplate at runtime.
基本上,ControlTemplate描述了如何显示控件,而DataTemplate描述了如何显示数据。
例如:
标签是一个控件,它将包括一个控制模板,该控制模板表示标签应该在一些内容(数据模板或其他控件)周围使用边框显示。
一个客户类是数据,将显示使用一个DataTemplate,可以说显示客户类型为一个包含两个textblock的StackPanel,一个显示名称,另一个显示电话号码。这可能是有帮助的注意,所有的类都显示使用DataTemplates,你将通常使用默认模板,这是一个TextBlock的文本属性设置为对象的ToString方法的结果。
ControlTemplate定义视觉外观,dattemplate替换数据项的视觉外观。
示例:我想显示一个按钮从矩形到圆形的形式=>控制模板。
如果控件有复杂的对象,它只调用并显示ToString(),使用DataTemplate,您可以获得各种成员并显示和更改数据对象的值。