[英]How to set header for tabitem, when items adding through xaml views in tabcontrol WPF?
我將5個XAML視圖(即UserControls)添加到Tab控件WPF中。 每個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
無法在TabItem
Header的ContentPresenter
之后遍歷。
為什么不想將項目包裝在TabItem
?
WPF在渲染時仍會這樣做,我懷疑這是您的問題,因為默認情況下Header為null,因此ItemTemplate
的DataContext為null
(您可以使用Snoop進行驗證)
<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>
我通過在ViewModel中包含一個包含Tabitem名稱的String來處理此問題。 然后,我使用XAML綁定簡單地綁定到該字符串。
<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";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.