如果我有一个名为GuiObject的类,那个类有一个名为GuiObjects的GuiObjects列表:“GuiObjects” .
现在说我的窗口有一个GuiObjects列表,我在.xaml文件中使用dataBind到:
<StackPanel>
<ItemsControl ItemsSource="{Binding TopObjectList}" DataTemplateSelector="{DynamicResource templateSelector"/>
</StackPanel>
我可以为我想要生成的每种类型的FrameworkElement创建一个datatemplate,但是我遇到了TabControl的问题 . 我可以为tabControl创建一个datatemplate,如下所示:
<DataTemplate x:key="TabControlTemplate" DataTemplateSelector="{DynamicResource templateSelector" >
<TabControl ItemsSource="{Binding GuiObjects}" />
</DataTemplate>
结果是一个选项卡控件,其中包含每个正确的页面,但没有单个TabItems的内容 . 很公平,我只会为TabItems制作一个DataTemplate . 对于每个TabItem,我想将GuiObjects的内容放入stackpanel .
<DataTemplate x:key="TabItemTemplate" DataTemplateSelector="{Resource templateSelector">
<TabItem Header = {Binding Title}>
<StackPanel>
<ItemsControl ItemsSource="{Binding GuiObjects}" DataTemplateSelector="{DynamicResource templateSelector"/>
</StackPanel>
</TabItem>
</DataTemplate>
这里的问题是TabItemTemplate永远不会被调用 . 我尝试过在TabControlTemplate中设置ItemContainerStyle的解决方案,但后来我遇到了层次结构的问题 . 如果我在TabItem的内容中绑定“GuiObjects”,我将绑定tabItems列表,而不是每个TabItem中的列表 . (我想做第二个) . 这是一个例子:
<DataTemplate x:key="TabControlTemplate" DataTemplateSelector="{DynamicResource templateSelector" >
<TabControl ItemsSource="{Binding GuiObjects}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding Title}"/>
<Setter Property="Content" Value="<StackPanel><ItemsControl ItemsSource="{Binding GuiObjects}" DataTemplateSelector="{DynamicResource templateSelector"/></StackPanel>"/>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
</DataTemplate>
同样,这个解决方案有级别问题:当我说:我指的是TabItems列表,而不是每个TabItem中的FrameworkElements列表 .
解决方案是要么为TabControl和TabItem添加单独的DataTemplates,只需修复它,以便DataTemplateSelector实际上适用于TabItems(不知道如何做到这一点) . 或者使用ItemContainerStyle,并以某种方式告诉它在绑定GuiObjects时向下一级 . 有人知道怎么做吗?
1 回答
要为TabControl的页面内容提供模板,请使用以下属性:
ContentTemplate
ContentTemplateSelector
TabControl
的ItemTemplate / ItemTemplateSelector属性用于定义选项卡 Headers 的外观 .