簡體   English   中英

如何在tabcontrol WPF中通過xaml視圖添加項目時為tabitem設置標題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM