2009-06-01 9 views
4

J'ai un contrôle personnalisé qui est dérivé de TabItem, et je veux de cette base de données personnalisé TabItem à un stock TabControl. Je préfère éviter de créer un nouveau TabControl juste pour ce cas rare.Comment puis-je utiliser un contrôle TabItem personnalisé lors de la liaison de données d'un TabControl dans WPF?

C'est ce que j'ai et je n'ai pas de chance d'avoir le bon contrôle à charger. Dans ce cas, je veux utiliser mon contrôle ClosableTabItem au lieu du contrôle TabItem stock.

<TabControl x:Name="tabCases" IsSynchronizedWithCurrentItem="True" 
      Controls:ClosableTabItem.TabClose="TabClosed" > 
    <TabControl.ItemTemplate> 
     <DataTemplate DataType="{x:Type Controls:ClosableTabItem}" > 
      <TextBlock Text="{Binding Path=Id}" /> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate DataType="{x:Type Entities:Case}"> 
      <CallLog:CaseReadOnlyDisplay DataContext="{Binding}" /> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

EDIT: C'est ce que j'ai fini avec, plutôt que d'essayer de lier un contrôle personnalisé. Le "CloseCommand" provenant d'un previous question.

<Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}" > 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TabItem}"> 
        <Border 
          Name="Border" 
          Background="LightGray" 
          BorderBrush="Black" 
          BorderThickness="1" 
          CornerRadius="25,0,0,0" 
          SnapsToDevicePixels="True"> 
         <StackPanel Orientation="Horizontal"> 
         <ContentPresenter x:Name="ContentSite" 
           VerticalAlignment="Center" 
           HorizontalAlignment="Center" 
           ContentSource="Header" 
           Margin="20,1,5,1"/> 
          <Button 
           Command="{Binding Path=CloseCommand}" 
           Cursor="Hand" 
           DockPanel.Dock="Right" 
           Focusable="False" 
           Margin="1,1,5,1" 
           Background="Transparent" 
           BorderThickness="0"> 
           <Image Source="/Russound.Windows;component/Resources/Delete.png" Height="10" /> 
          </Button> 
         </StackPanel> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="FontWeight" Value="Bold" /> 
          <Setter TargetName="Border" Property="Background" Value="LightBlue" />        
          <Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0" /> 
          <Setter TargetName="Border" Property="BorderBrush" Value="DarkBlue" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Répondre

1

Vous ne voulez pas définir la DataType du DataTemplate dans ce cas. La valeur de la propriété ItemTemplate est utilisée à chaque fois qu'un nouvel élément doit être ajouté et, dans le cas d'un contrôle onglet, il sera utilisé pour créer un nouveau TabItem. Vous devez déclarer une instance de votre classe dans le DataTemplate lui-même:

<TabControl x:Name="tabCases" IsSynchronizedWithCurrentItem="True" Controls:ClosableTabItem.TabClose="TabClosed"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <Controls:ClosableTabItem> 
       <TextBlock Text="{Binding Path=Id}" /> 
      </Controls:ClosableTabItem> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate DataType="{x:Type Entities:Case}"> 
      <CallLog:CaseReadOnlyDisplay DataContext="{Binding}" /> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

Cela entraînera une nouvelle ClosableTabItem à créer à chaque fois qu'un nouvel onglet est ajouté à la TabControl.

Mise à jour; De votre commentaire, il semble que le ItemTemplate contrôle ce qui est créé dans le TabItem, plutôt que de changer le TabItem lui-même. Pour faire ce que vous voulez faire, mais pour un TreeView, vous devez définir le HeaderTemplate. Malheureusement, je ne vois pas la propriété HeaderTemplate de TabControl.

J'ai effectué une recherche et this tutorial modifie le contenu des en-têtes d'onglet en ajoutant des contrôles à TabItem.Header. Peut-être que vous pourriez créer un Style pour votre TabItems qui ajouterait le bouton de fermeture que votre classe est en train d'ajouter?

+0

J'ai essayé cela, et ce qui semble se passer est que mon contrôle personnalisé est chargé à l'intérieur d'un TabItem stock. Cela me laisse avec une bordure autour de mon contrôle personnalisé, ainsi que mon contrôle personnalisé ne sait pas comment passer le focus à l'onglet Tabitem. – Russ

6

trouvé un moyen, dérivez une classe de TabControl et remplacer cette fonction, dans mon cas, je veux que les éléments du contrôle onglet (quand elle est liée) être CloseableTabItems

public class CloseableTabControl : TabControl 
    { 
     protected override DependencyObject GetContainerForItemOverride() 
     { 
      return new CloseableTabItem(); 
     } 
    } 

HTH Quelqu'un

Sam