2009-06-01 6 views
4

TabItemから派生したカスタムコントロールがあります。そのカスタムTabItemを在庫TabControlにデータバインドしたいと思います。このまれなケースのために新しいTabControlを作成することを避けたいと思います。WPFでTabControlをデータバインドするときに、カスタムTabItemコントロールを使用するにはどうすればよいですか?

これは私の持っているものであり、正しいコントロールがロードされていることはありません。この場合、TabItemコントロールの代わりにClosableTabItemコントロールを使用します。

<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:これはむしろ、カスタムコントロールをバインドしようとするよりも、私がなってしまったものです。 「CloseCommand」は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> 

答えて

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> 

これは、新しいタブを0​​に追加されるたびに作成される新しいClosableTabItemの原因となります。

更新;あなたのコメントから、TabItem自体を変更するのではなく、がTabItem内に作成されたものを制御するように思えます。あなたがやりたいことをするには、TreeViewの場合はHeaderTemplateと設定します。残念ながらHeaderTemplateプロパティはTabControlではありません。

this tutorialは、コントロールをTabItem.Headerに追加することによってタブヘッダーの内容を変更します。あなたのTabItemsのためにStyleを作成して、あなたのクラスが現在追加している閉じるボタンを追加することができますか?

+0

私はそれを試みましたが、私のカスタムコントロールが在庫TabItemの中に読み込まれているようです。これにより、私のカスタムコントロールの周りに境界線が残っているだけでなく、カスタムコントロールはフォーカスタブを通過する方法を知らないままになります。 – Russ

6

は、 はTabControlのからクラスを派生し、この関数をオーバーライドし、方法を見つけた(結合したときに)私の場合、私はCloseableTabItems

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

HTH誰か

するタブコントロールの項目をしたいですサム