如何在tabcontrol WPF中通过xaml视图添加项目时为tabitem设置标题?

时间:2011-12-19 09:43:53

标签: c# wpf tabcontrol

我正在向Tab Control WPF添加5个XAML视图(即UserControls)。每个UserControl的相应标签项已按预期呈现。但我想知道如何为这些标签项设置标题。有什么办法吗? 注意:我不想直接将标签项添加到TabControl

我的UserControl:

public class TimeConsumingView : UserControl
{
    public string Header
    {
        get { return (string)GetValue(HeaderProperty); }
        set { SetValue(HeaderProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Header.
    // This enables animation, styling, binding, etc...
    public static readonly DependencyProperty HeaderProperty =
        DependencyProperty.Register(
            "Header",
            typeof(string),
            typeof(TimeConsumingView),
            new UIPropertyMetadata(
                "",
                new PropertyChangedCallback(OnHeaderChanged)));
}

我的Shell视图:

 <TabControl x:Name="TabControl">
     <TabControl.ItemTemplate>
         <DataTemplate>
             <TextBlock Text="{Binding Header}"  x:Name="grid" />
         </DataTemplate>
     </TabControl.ItemTemplate>
     <!--<local:GeneralView Header="General"/>-->
     <local:TimeConsumingView Header="2006 - 2007"/>
     <local:TimeConsumingView Header="2007 - 2008"/>
 </TabControl>

在这种情况下,标题未绑定到TextBlock。从Snoop看,似乎DataContext无法在ContentPresenter标题TabItem之后遍历。

2 个答案:

答案 0 :(得分:2)

为什么不想将商品换成TabItem

WPF无论如何都会在渲染时执行此操作,我怀疑这是您的问题,因为默认情况下Header为null,因此ItemTemplate有一个null DataContext(您可以使用{{3}验证这一点})

<TabControl x:Name="TabControl">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}"  x:Name="grid" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <!--<local:GeneralView Header="General"/>-->
    <TabItem Header="2006 - 2007">
        <local:TimeConsumingView Header="2006 - 2007"/>
    </TabItem>
    <TabItem Header="2007 - 2008">
        <local:TimeConsumingView Header="2007 - 2008"/>
    </TabItem>
</TabControl>

如果你真的坚持不使用TabItem包装器(WPF默认会插入),请使用TabItem样式设置Header属性

<Style TargetType="{x:Type TabItem}">
    <Setter Property="Header" Value="{Binding Header}" />
</Style>

答案 1 :(得分:1)

我通过在我的ViewModel中包含一个包含Tabitem名称的String来处理这个问题。然后我使用XAML Bindings简单地绑定到该String。

<TabControl
        ItemsSource="{Binding Workspaces}" 
        SelectedItem="{Binding CurrentPage, Mode=TwoWay}" 
        SelectedIndex="{Binding SelectedWorkspace, UpdateSourceTrigger=PropertyChanged}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <DockPanel>
                  <TextBlock Text="{Binding Header}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </DockPanel>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

在我的ViewModel中,我有一个名为Header的属性。

public String Header { get; set; }

public MyConstructor()
{
     Header = "Name of Tab";
}

另一种解决方案是覆盖ToString()。

public override string ToString()
{
    return "Name of my Tab";
}