C# WPF:TabControl.ItemTemplate和TabItem.ContentTemplate之间的差异
我对此困惑了很长时间,这两个选项似乎都会影响tabitems在tabcontrol中的显示。 它是为最好地控制tabcontrol的表示而设计的吗? 或者如果有什么我不明白的地方。 设置C# WPF:TabControl.ItemTemplate和TabItem.ContentTemplate之间的差异,c#,wpf,C#,Wpf,我对此困惑了很长时间,这两个选项似乎都会影响tabitems在tabcontrol中的显示。 它是为最好地控制tabcontrol的表示而设计的吗? 或者如果有什么我不明白的地方。 设置TabControl.ItemTemplate可以为TabControl的Items集合中的所有TabItems指定一个模板,除非为特定的TabItem覆盖TabItem.ContentTemplate 因此,尽管它们的作用相同,TabControl.ItemTemplate是TabControl和TabItem
TabControl.ItemTemplate
可以为TabControl
的Items
集合中的所有TabItems
指定一个模板,除非为特定的TabItem
覆盖TabItem.ContentTemplate
因此,尽管它们的作用相同,TabControl.ItemTemplate
是TabControl
和TabItem中所有TabItems
的更通用的模板。ContentTemplate
特定于它在中使用的TabItem
。
上述情况并不完全正确,因为TabControl
有一个ItemTemplate
属性和一个ContentTemplate
属性,这使它更容易混淆
ItemTemplate
用作通过ItemsSource
上的数据绑定或通过Xaml添加的所有TabItems
的标题(选项卡内容)的模板,而不使添加的项目成为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>
我们将有一个带有三个选项卡的TabControl
,标题文本为黑色,内容仍然为蓝色。还有一个数据错误,通知我们对于已经是ItemsControl的
容器类型的项,忽略了ItemTemplate
和ItemTemplateSelector
属性,在本例中为TabItem
。在这种情况下,我们需要指定TabItem.HeaderTemplate
来更改标题的外观
所以
TabControl.ItemTemplate
和TabItem.ContentTemplate
不做同样的事情,但是我前面的解释仍然适用于TabControl.ContentTemplate
和TabItem.ContentTemplate
属性ItemsControl.ItemTemplate
用于定义数据绑定集合中的每个项的外观。。。从MSDN上的页面:
获取或设置用于显示每个项的数据模板
如您所见,它的类型为DataTemplate
,通常用于显示数据的模板。。。其DataContext
将自动设置为集合中的项目,因此在该DataTemplate
中声明的控件将自动访问项目属性。请参阅MSDN上的页面以获取更多帮助
类似地,从MSDN中可以看出:
获取或设置用于显示ContentControl
内容的数据模板
同样,其DataContext
将自动设置为设置为Content
属性的对象。请注意,ContentControl
只有一个ContentTemplate
属性,没有用于集合项目的itemtplate
属性。。。从MSDN上的数据模板概述页面:
由于myTaskTemplate是一种资源,您现在可以在具有采用DataTemplate类型的属性的其他控件上使用它。如上所示,对于ItemsControl对象,例如ListBox,它是ItemTemplate属性。对于ContentControl对象,它是ContentTemplate属性
更新>>> 为了进一步澄清这种情况,请考虑以下简单规则: 使用
ContentTemplate
属性定义设置为ContentControl
属性的对象的外观
使用ItemTemplate
属性定义集合控件项的外观
这是最简单的区别。但是,我想指出,由于这些属性都是DataTemplate
类型,因此它们的值是可互换的
例如,假设您有一个Person
类,并且在列表框中显示Person
对象的集合。您可以声明一个DataTemplate
以设置为ListBox.ItemTemplate
属性,以定义集合中每个Person
的外观。但是,如果您只想显示单个Person
,则可以使用ContentControl
,将Content
设置为Person
类的实例,并且仍然使用相同的DataTemplate
,但改为设置为ContentTemplate
:
多个对象:
<ListBox ItemsSource="{Binding People}" ItemTemplate="{StaticResource Template}" ... />
单个对象:
<ContentControl Content="{Binding Person}"
ContentTemplate="{StaticResource Template}" ... />
对于一个非常简单的问题,这里有一些很长的答案。为避免混淆:
ItemTemplate
是用于格式化ItemsSource
中的每个项目以创建标题(显示在选项卡栏中的控件)的模板,ContentTemplate
是用于格式化ItemsSource
中的每个项目以创建选项卡内容的模板(单击标题时显示的控件).我相信这也有同样的作用。谢谢,你的解释很有用。事实上,我不太正确。刚刚检查并发现TabControl
有一个ItemTemplate
属性和一个ContentTemplate
属性。我会马上更新我的答案以反映这一点。所以结论是:TabControl(或列表框)是itemsControl,这意味着它的属性(如itemTemplate)只负责其自身的item表单和itemssource。并且它不会以其他方式对添加的对象起作用。对吗?非常棒的解释。非常感谢,Sheridan。
<ContentControl Content="{Binding Person}"
ContentTemplate="{StaticResource Template}" ... />