如果我有一个名为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>
同样,这个解决方案有级别问题:当我说:{Binding GuiObjets}时,我指的是TabItems列表,而不是每个TabItem中的FrameworkElements列表。
解决方案是要么为TabControl和TabItem添加单独的DataTemplates,只需修复它以便DataTemplateSelector实际上适用于TabItems(不知道如何执行此操作)。或者使用ItemContainerStyle,并以某种方式告诉它在绑定GuiObjects时向下一级。有谁知道怎么做?