很长一段时间我对此感到困惑,这些似乎都影响了tabcontrol中tabitems的演示.它是否设计用于最佳控制tabcontrol的表示?或者,如果有什么我不明白.
Nat*_*ips 26
这里有一些非常长的答案,实际上这是一个非常简单的问题.为避免混淆:
ItemTemplate是用于格式化每个项目ItemsSource以创建标题(显示在标签栏中的控件)ContentTemplate的模板,并且是用于格式化每个项目ItemsSource以创建标签内容的模板(单击时显示的控件)在标题上).
设置您指定要用于集合中TabControl.ItemTemplate所有内容的模板,除非您覆盖特定的模板。TabItemsItemsTabControlTabItem.ContentTemplateTabItem
因此,虽然它们做同样的事情,但TabControl.ItemTemplate它是一个更通用的模板,适用于所有内容,TabItems并且TabControl特定TabItem.ContentTemplate于TabItem它所使用的内容。
上面的说法并不完全正确,因为TabControl有一个ItemTemplate属性和一个ContentTemplate属性,使其更加混乱。
ItemTemplateTabItems用作通过数据绑定或通过 Xaml 添加的所有标题(选项卡)的模板,ItemsSource而不使添加的项目成为TabItem:
<TabControl ItemsSource="{Binding ListOfItems}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Foreground="Red"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Foreground="Blue"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
这将TabControl在标题/选项卡中创建红色文本,并在内容中创建蓝色文本。
现在,如果我们执行以下操作:
<TabControl>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Foreground="Red"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Foreground="Blue"/>
</DataTemplate>
</TabControl.ContentTemplate>
<TabItem Header="One" Content="One"/>
<TabItem Header="Two" Content="Two"/>
<TabItem Header="Three" Content="Three"/>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
我们将拥有TabControl三个选项卡,标题文本为黑色,内容仍为蓝色。还有一个 DataError 通知我们对于已经属于容器类型的项目(在本例中为 ),将忽略ItemTemplate和属性。在这种情况下,我们需要指定更改标头的外观。ItemTemplateSelectorItemsControl'sTabItemTabItem.HeaderTemplate
所以TabControl.ItemTemplate和TabItem.ContentTemplate不做同样的事情,但我之前的解释仍然适用于TabControl.ContentTemplate和TabItem.ContentTemplate。
该ItemsControl.ItemTemplate属性用于定义数据绑定集合中的每个项目应该是什么样的......来自MSDN上的" ItemsControl.ItemTemplate属性"页面:
获取或设置用于显示每个项目的DataTemplate.
正如您所看到的,它是类型的DataTemplate,这是显示数据的模板的惯例...... DataContext它将自动设置为集合中的项目,因此声明的控件DataTemplate将自动访问items属性.有关此问题的更多帮助,请参阅MSDN上的" 数据模板概述"页面.
同样,从MSDN,ContentControl.ContentTemplate属性:
获取或设置用于显示内容的数据模板
ContentControl.
同样,DataContext它将自动设置为设置为Content属性的对象.请注意,MSDN上的数据模板概述页面中ContentControl只有一个ContentTemplateProperty和no ItemTemplateProperty,用于收集项...
因为myTaskTemplate是一种资源,所以现在可以在具有采用DataTemplate类型的属性的其他控件上使用它.如上所示,对于ItemsControl对象,例如ListBox,它是ItemTemplate属性.对于ContentControl对象,它是ContentTemplate属性.
更新>>>
为了进一步澄清这种情况,请考虑以下简单规则:
使用该
ContentTemplate属性可以定义设置为Contenta属性的对象ContentControl应该如何显示.使用该
ItemTemplate属性可以定义集合控件的项目应如何显示.
最简单的区别.但是,我想指出,由于这些属性都是类型DataTemplate,它们的值是可以互换的.
例如,假设您有一个Person类,并且您Person在一个对象中显示一组对象ListBox.您可以声明a DataTemplate设置为ListBox.ItemTemplate属性,以定义Person集合中每个元素的外观.但是,如果您只想显示单个Person,那么您可以使用ContentControl带有该类Content的实例Person,并仍然使用相同的 DataTemplate,但设置为ContentTemplate:
多个对象:
<ListBox ItemsSource="{Binding People}" ItemTemplate="{StaticResource Template}" ... />
Run Code Online (Sandbox Code Playgroud)
...
单个对象:
<ContentControl Content="{Binding Person}"
ContentTemplate="{StaticResource Template}" ... />
Run Code Online (Sandbox Code Playgroud)