【发布时间】:2014-01-23 05:57:54
【问题描述】:
如果我有一个名为:GuiObject 的类,并且该类有一个名为“GuiObjects”的 GuiObjects 列表。
现在说我的窗口有一个 GuiObjects 列表,我在 .xaml 文件中使用它来数据绑定到:
<StackPanel>
<ItemsControl ItemsSource="{Binding TopObjectList}" DataTemplateSelector="{DynamicResource templateSelector"/>
</StackPanel>
我可以为我想要生成的每种类型的 FrameworkElement 创建一个数据模板,但是我在使用 TabControl 时遇到了问题。我可以像这样为 tabControl 创建一个数据模板:
<DataTemplate x:key="TabControlTemplate" DataTemplateSelector="{DynamicResource templateSelector" >
<TabControl ItemsSource="{Binding GuiObjects}" />
</DataTemplate>
结果是一个选项卡控件,其中包含每个正确的页面,但没有各个 TabItems 的内容。很公平,我只会为 TabItems 制作一个 DataTemplate。对于每个 TabItem,我想将 GuiObjects 的内容放入堆栈面板中。
<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 时以某种方式告诉它下降一级。有人知道怎么做吗?
【问题讨论】:
-
DataTemplate没有DataTemplateSelector属性,所以我想知道如何在第二个代码示例中为一个赋值。
标签: wpf datatemplate tabcontrol tabitem