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属性定义设置为ContentControlContent属性的对象应该如何显示。

使用ItemTemplate属性定义集合控件的项目应如何显示。

最简单的区别。 但是,我想指出,由于这些属性都是DataTemplate类型,因此它们的值可互换的。

例如,假设您有一个Person类,并在ListBox显示Person对象的集合。 您可以将DataTemplate声明为ListBox.ItemTemplate属性,以定义集合中每个Person的外观。 但是,如果您只想显示一个Person ,那么您可以使用ContentControl ,将Content设置为Person类的实例,并仍使用相同的 DataTemplate ,但设置为ContentTemplate

多个对象:

  

单个对象:

  

这里有一些非常长的答案,实际上这是一个非常简单的问题。 为避免混淆:

ItemTemplate是用于格式化ItemsSource每个项目以创建标题(显示在选项卡栏中的控件)的模板,而ContentTemplate是用于格式化ItemsSource每个项目以创建选项卡内容的模板(控件单击标题时出现)。

设置TabControl.ItemTemplate指定一个模板,用于TabControlItems集合中的所有TabItem ,除非您覆盖特定TabItemTabItem.ContentTemplate

因此,当它们执行相同操作时, TabControl.ItemTemplateTabControlTabItem的更通用模板TabItem.ContentTemplate特定于其使用的TabItem

以上情况并不完全正确,因为TabControl具有ItemTemplate属性和ContentTemplate属性,使其更加混乱。

ItemTemplate用作通过ItemsSource上的数据绑定或通过Xaml添加的所有TabItem的标题(tab thingy)的模板,而不使添加的项成为TabItem

             

这将创建一个TabControl ,标题/选项卡中带有红色文本,内容带有蓝色文本。

现在,如果我们执行以下操作:

                

我们将有一个带有三个选项卡的TabControl ,标题文本为黑色,内容仍为蓝色。 还有一个DataError告诉我们ItemTemplateItemTemplateSelector属性会被ItemsControl's容器类型的项目忽略,在本例中是TabItem 。 在这种情况下,我们需要指定TabItem.HeaderTemplate来更改标题的外观。

因此TabControl.ItemTemplateTabItem.ContentTemplate不会这样做,但我之前的解释仍适用于TabControl.ContentTemplateTabItem.ContentTemplate