2009-06-01 12 views
4

Ich habe ein benutzerdefiniertes Steuerelement, das von TabItem abgeleitet ist, und ich möchte diese benutzerdefinierte TabItem zu einem Lager TabControl. Ich würde lieber vermeiden, eine neue TabControl nur für diesen seltenen Fall zu erstellen.Wie kann ich ein benutzerdefiniertes TabItem-Steuerelement beim Datenbinding eines TabControl in WPF verwenden?

Das ist, was ich habe und ich habe kein Glück, die richtige Kontrolle geladen zu bekommen. In diesem Fall möchte ich meine ClosableTabItem Steuerung anstelle der Lager TabItem Steuerung verwenden.

<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: Das ist, was ich mit endete, anstatt zu versuchen, ein benutzerdefiniertes Steuerelement zu binden. Die "CloseCommand" im bekommen von einer 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> 

Antwort

1

Sie wollen nicht die DataType des DataTemplate in diesem Fall einzustellen. Der Wert der Eigenschaft ItemTemplate wird immer dann verwendet, wenn ein neues Element hinzugefügt werden muss. Im Falle eines Registersteuerelements wird es zum Erstellen einer neuen TabItem verwendet. Sie sollten eine Instanz der Klasse innerhalb der DataTemplate selbst erklären:

<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> 

Dies wird eine neue ClosableTabItem verursachen geschaffen werden, sobald eine neue Registerkarte zum TabControl hinzugefügt wird.

Aktualisierung; Von Ihrem Kommentar hört es sich so an, als ob die ItemTemplate steuert, was innerhalb der TabItem erstellt wird, anstatt die TabItem selbst zu ändern. Um zu tun, was Sie tun möchten, aber für eine TreeView, würden Sie die HeaderTemplate setzen. Leider sehe ich keine HeaderTemplate Eigenschaft von TabControl.

Ich habe einige Suche durchgeführt, und this tutorial ändert den Inhalt der Registerkartenheader durch Hinzufügen von Steuerelementen zu TabItem.Header. Vielleicht könnten Sie eine Style für Ihre TabItems erstellen, die die Schaltfläche zum Schließen hinzufügen würde, die Ihre Klasse gerade hinzufügt?

+0

Ich habe das versucht, und was scheint zu passieren ist, dass meine benutzerdefinierte Steuerung in einem Lager TabItem geladen wird. Dies lässt mich mit einem Rahmen um mein benutzerdefiniertes Steuerelement, sowie meine benutzerdefinierte Steuerelement nicht wissen, wie Sie den Fokus auf den Bestand Tabitem übergeben. – Russ

6

hat einen Weg gefunden, leiten eine Klasse von TabControl und diese Funktion außer Kraft setzen, in meinem Fall möchte ich die Elemente der Registerkarte (wenn gebunden) CloseableTabItems

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

HTH Jemand

zu sein Sam