WPF:TabControl.ItemTemplate和TabItem.ContentTemplate之间的区别
很长一段时间我对此感到困惑,这些似乎都影响了tabcontrol中tabitems的演示。 它是否设计用于最佳控制tabcontrol的表示? 或者,如果有什么我不明白。
ItemsControl.ItemTemplate
属性用于定义数据绑定集合中的每个项目应该是什么样的……来自MSDN上的ItemsControl.ItemTemplate
属性页面:
获取或设置用于显示每个项目的DataTemplate。
正如您所看到的,它是DataTemplate
类型,它通常用于显示数据的模板……其DataContext
将自动设置为集合中的项目,因此在该DataTemplate
声明的控件将自动访问items属性。 有关此问题的更多帮助,请参阅MSDN上的“ 数据模板概述”页面。
同样,从MSDN, ContentControl.ContentTemplate
属性 :
获取或设置用于显示
ContentControl
内容的数据模板。
同样,它的DataContext
将自动设置为设置为Content
属性的对象。 请注意, ContentControl
只有一个ContentTemplate
属性,没有ItemTemplate
属性,用于收集项目……来自MSDN上的数据模板概述页面:
因为myTaskTemplate是一种资源,所以现在可以在具有采用DataTemplate类型的属性的其他控件上使用它。 如上所示,对于ItemsControl对象,例如ListBox,它是ItemTemplate属性。 对于ContentControl对象,它是ContentTemplate属性。
更新>>>
为了进一步澄清这种情况,请考虑以下简单规则:
使用
ContentTemplate
属性定义设置为ContentControl
的Content
属性的对象应该如何显示。使用
ItemTemplate
属性定义集合控件的项目应如何显示。
最简单的区别。 但是,我想指出,由于这些属性都是DataTemplate
类型,因此它们的值是可互换的。
例如,假设您有一个Person
类,并在ListBox
显示Person
对象的集合。 您可以将DataTemplate
声明为ListBox.ItemTemplate
属性,以定义集合中每个Person
的外观。 但是,如果您只想显示一个Person
,那么您可以使用ContentControl
,将Content
设置为Person
类的实例,并仍使用相同的 DataTemplate
,但设置为ContentTemplate
:
多个对象:
…
单个对象:
这里有一些非常长的答案,实际上这是一个非常简单的问题。 为避免混淆:
ItemTemplate
是用于格式化ItemsSource
每个项目以创建标题(显示在选项卡栏中的控件)的模板,而ContentTemplate
是用于格式化ItemsSource
每个项目以创建选项卡内容的模板(控件单击标题时出现)。
设置 TabControl.ItemTemplate
指定一个模板,用于TabControl
的Items
集合中的所有TabItem
,除非您覆盖特定TabItem
的TabItem.ContentTemplate
。
因此,当它们执行相同操作时, TabControl.ItemTemplate
是TabControl
和TabItem
的更通用模板TabItem.ContentTemplate
特定于其使用的TabItem
。
以上情况并不完全正确,因为TabControl
具有ItemTemplate
属性和ContentTemplate
属性,使其更加混乱。
ItemTemplate
用作通过ItemsSource
上的数据绑定或通过Xaml添加的所有TabItem
的标题(tab thingy)的模板,而不使添加的项成为TabItem
:
这将创建一个TabControl
,标题/选项卡中带有红色文本,内容带有蓝色文本。
现在,如果我们执行以下操作:
我们将有一个带有三个选项卡的TabControl
,标题文本为黑色,内容仍为蓝色。 还有一个DataError告诉我们ItemTemplate
和ItemTemplateSelector
属性会被ItemsControl's
容器类型的项目忽略,在本例中是TabItem
。 在这种情况下,我们需要指定TabItem.HeaderTemplate
来更改标题的外观。
因此TabControl.ItemTemplate
和TabItem.ContentTemplate
不会这样做,但我之前的解释仍适用于TabControl.ContentTemplate
和TabItem.ContentTemplate
。