2016-05-18 5 views
1

я использую DataBinding, чтобы показать все элементы управления в ItemsSourceDataTemplate не обнаруживается с TabControl

 <TabControl Grid.Row="1" TabStripPlacement="Left" ItemsSource="{Binding Source={StaticResource WorkflowSelector}, Path=Workflows}" SelectedIndex="0"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <Label Content="{Binding PluginName}"></Label> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
    </TabControl> 

WorkflowSelector является моим ViewModel, который содержит список всех элементов управления, которые должны быть показаны в TabControl.

Я создал itemTemplate, чтобы показать PluginName (общедоступное свойство) на вкладке , но ничего не отображается.

Если я проверяю визуальное дерево, я могу видеть привязку данных Tabcontrol, содержащую 1 элемент, который имеет свойство PluginName. Рассчитанное Значение BindingExpression этикетно пусто

первой вещь, которую я заметил, что ContentPresenter не имеет DataContext, в то время как Border делает имеет правильную DataContext

Visual Tree of the application; ContentPresenter does not hold the DataContext

Дополнительно .. ., если я изменить ItemTemplate на ContentTemplate связывание работает правильно (но в содержании не в заголовке)

+0

вы хотите изменить 'Header'' TabITem' или 'TabItem'? – StepUp

+0

Я хочу изменить заголовок – Markus

+0

Я не уверен, почему ваш код не работает, я думаю, он должен и [этот ответ] (http://stackoverflow.com/a/5651542/302677) показывает очень похожий код, который Я думаю, что работает. Лучше предположить, что у вас есть какой-то пользовательский стиль, или, возможно, неявный DataTemplate, который мешает. Можете ли вы скопировать/вставить соответствующие части в новый проект для тестирования? – Rachel

ответ

0

, так как я видел в дереве визуалов, что DataContext была установлена ​​выше в иерархии, я изменил мои привязки данных:

<Label Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabItem}}, Path=DataContext.PluginName}"></Label> 

это не объясняет: корневой причина, но это короткое обходное решение, с которым я могу жить с

0

чтобы изменить HeaderTemplate из TabControl, вы должны установить стиль TabItem в го изменить HeaderTemplate:

<TabControl> 
     <TabControl.Resources> 
      <Style TargetType="{x:Type TabPanel}"> 
       <Setter Property="Background" Value="Yellow"/> 
      </Style> 
      <Style TargetType="{x:Type TabItem}"> 
       <Setter Property="BorderThickness" Value="0"/> 
       <Setter Property="Padding" Value="0" /> 
       <Setter Property="HeaderTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <Border x:Name="grid" Background="Red"> 
           <ContentPresenter> 
            <ContentPresenter.Content> 
             <Border BorderThickness="3" BorderBrush="Red" CornerRadius="5"> 
             <StackPanel>             
              <TextBlock Margin="4" FontSize="15" Text="{TemplateBinding Content}"/> 
              <TextBlock>I am a header</TextBlock> 
             </StackPanel> 
             </Border> 
            </ContentPresenter.Content>           
           </ContentPresenter> 
          </Border> 
          <DataTemplate.Triggers> 
           <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TabItem}},Path=IsSelected}" Value="True"> 
            <Setter TargetName="grid" Property="Background" Value="Green"/> 
           </DataTrigger> 
          </DataTemplate.Triggers> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </TabControl.Resources>    
     <TabItem Header="Hey1" Name="tabItem1"> 
     </TabItem> 
     <TabItem Header="Hey2" Name="tabItem2"> 
     </TabItem> 
     <TabItem Header="Hey3" Name="tabItem3"> 
     </TabItem> 
     <TabItem Header="Hey4" Name="tabItem4"> 
     </TabItem> 
    </TabControl> 
+0

@Markus не стесняйтесь задавать любые вопросы. Если вы чувствуете, что мой ответ помогает вам, вы можете отметить мой ответ как ответ, чтобы упростить будущий поиск других людей. Пожалуйста, прочитайте это http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp

+0

. Я свяжу Itemseource TabControl с коллекцией Observable. Я не уверен, как ваш подход помогает мне получить динамический размер вкладок в зависимости от элементов в моем списке (ваше решение добавляет 1 TabItem ...) – Markus

+0

@Markus Я обновил ответ, и можно видеть, что этот 'TabControl 'с динамическим размером. Вы можете добавить столько, сколько хотите. – StepUp

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