如何在WPF中使用自定义TabItem控件来绑定TabControl时的数据?

4
我有一个自定义控件,派生自TabItem,我想将该自定义TabItem与股票TabControl进行数据绑定。我宁愿避免只为这种罕见情况创建新的TabControl
这就是我的代码,但我没有成功地加载正确的控件。在这种情况下,我想使用我的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>

编辑:最终我得到的结果不是尝试绑定自定义控件,而是从之前的问题中获取"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>
2个回答

7

我找到了一种方法,可以从TabControl派生一个类并重写此函数,在我的情况下,我希望Tab控件的项目(在绑定时)成为可关闭的选项卡项。

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

有什么我可以帮忙的吗?

Sam


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>

这将导致每当向TabControl添加新选项卡时,都会创建一个新的ClosableTabItem

更新:根据您的评论,似乎ItemTemplate控制在TabItem中创建什么,而不是更改TabItem本身。要做你想做的事情,但针对TreeView,你需要设置HeaderTemplate。不幸的是,我没有看到TabControlHeaderTemplate属性。

我进行了一些搜索,这个教程通过向TabItem.Header添加控件来修改选项卡标题的内容。也许您可以为您的TabItems创建一个Style,该样式将添加您的类当前正在添加的关闭按钮?


我已经尝试过了,看起来我的自定义控件被加载到了一个标准的TabItem中。这会在我的自定义控件周围留下一个边框,并且我的自定义控件不知道如何将焦点传递给标准的TabItem。 - Russ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接