2009-06-01 114 views
4

我有一個來自TabItem的自定義控件,我想將該自定義TabItem數據綁定到股票TabControl。我寧願避免爲這種罕見情況創建一個新的TabControl如何在數據綁定WPF中的TabControl時使用自定義TabItem控件?

這是我的,我沒有任何運氣得到正確的控制加載。在這種情況下,我想用我的ClosableTabItem控件而不是股票TabItem控件。

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

編輯:這是我結束了,而不是試圖綁定的自定義控件。 即時從previous question得到的「CloseCommand」。

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

回答

1

你不想設置DataTemplateDataType在這種情況下。無論何時需要添加新項目,都會使用ItemTemplate屬性的值,並且在製表符控件的情況下,它將用於創建新的TabItem。您應該DataTemplate本身中聲明你的類的實例:

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

這將導致創建一個新的ClosableTabItem每當一個新的選項卡添加到TabControl

更新;根據您的評論,這聽起來像ItemTemplate控制在TabItem內創建的內容,而不是更改TabItem本身。要做你想做的事情,但對於TreeView,你可以設置HeaderTemplate。不幸的是,我沒有看到 TabControl的財產。

我做了一些搜索,this tutorial通過向TabItem.Header添加控件來修改標籤標題的內容。也許你可以爲你的TabItems創建一個Style,它將添加你的班級正在添加的關閉按鈕?

+0

我已經試過了,什麼似乎發生的是,我的自定義控制股票的TabItem內加載。這給我留下了一個圍繞我的自定義控件的邊框,以及我的自定義控件不知道如何將焦點傳遞給股票tabitem。 – Russ 2009-06-01 19:49:01

6

找到了一種方法, 派生自TabControl的一類,並重寫此功能,在我來說,我希望標籤控件(綁定時)的項目是CloseableTabItems

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

HTH有人

山姆