2014-01-05 2 views
1

Если у меня есть класс под названием: 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. Кто-нибудь знает, как это сделать?

+1

['DataTemplate'] (http://msdn.microsoft.com/en-us/library/system.windows.datatemplate%28v=vs.110%29.aspx) не имеет свойства DataTemplateSelector, поэтому мне интересно, как вы можете присвоить значение одному в своем втором примере кода. –

ответ

8

Для того, чтобы предоставить шаблон для содержания из страниц TabControl, используют следующие свойства:

В ItemTemplate/ItemTemplateSelector свойство TabControl используются для определения того, как выглядят заголовки вкладок.

+0

+1 'TabControls' сложны^-^... – UIlrvnd

+0

Спасибо, работал как шарм! Лично мне нужен только ContentTemplate. – NickLokarno

Смежные вопросы