我正在向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
之后遍历。
答案 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";
}