Если у меня есть класс под названием: GuiObject, и этот класс имеет список объектов GuiObject, называемых «GuiObjects».Использование таблицы данных для TabItems в tabControl
Теперь предположим, что мое окно содержит список GuiObjects, которые я использую в .xaml файл в DataBind на:
<StackPanel>
<ItemsControl ItemsSource="{Binding TopObjectList}" DataTemplateSelector="{DynamicResource templateSelector"/>
</StackPanel>
я могу сделать DataTemplate для каждого типа FrameworkElement Я хочу, чтобы генерировать, но я У меня проблемы с TabControl. Я могу создать DataTemplate для TabControl, как так:
<DataTemplate x:key="TabControlTemplate" DataTemplateSelector="{DynamicResource templateSelector" >
<TabControl ItemsSource="{Binding GuiObjects}" />
</DataTemplate>
И результат управления вкладка, которая имеет каждый из соответствующих страниц настоящих, но без содержания отдельных TabItems. Достаточно справедливо, я просто сделаю DataTemplate для TabItems. Для каждого 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 никогда не вызывается. Я пробовал решения, связанные с установкой ItemContainerStyle в TabControlTemplate, но тогда у меня проблема иерархии. Если я свяжу «GuiObjects» внутри содержимого TabItem, я связываю список 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, вместо того, чтобы список FrameworkElements в пределах каждого TabItem.
Решение состоит в том, чтобы придерживаться отдельных DataTemplates как для TabControl, так и для TabItem, и просто исправить его, чтобы DataTemplateSelector действительно работал для TabItems (не знаю, как это сделать). Или пойти с ItemContainerStyle и как-то сказать ему спуститься на один уровень при связывании GuiObjects. Кто-нибудь знает, как это сделать?
['DataTemplate'] (http://msdn.microsoft.com/en-us/library/system.windows.datatemplate%28v=vs.110%29.aspx) не имеет свойства DataTemplateSelector, поэтому мне интересно, как вы можете присвоить значение одному в своем втором примере кода. –