Как установить заголовок для tabitem, когда элементы добавляются через представления xaml в tabcontrol WPF? - PullRequest
1 голос
/ 19 декабря 2011

Я добавляю 5 представлений XAML (т.е. UserControls) в 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)));
}

Моя оболочка:

 <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 ]

2 голосов
/ 19 декабря 2011

Почему вы не хотите обернуть свои вещи в TabItem?

WPF делает это в любом случае при рендеринге, что, как я подозреваю, является вашей проблемой, поскольку заголовок по умолчанию имеет значение null, поэтому ItemTemplate имеет null DataContext (Вы можете проверить это с помощью 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>
1 голос
/ 19 декабря 2011

Я справляюсь с этим, имея строку в моей ViewModel, которая содержит имя Tabitem.Затем я просто привязываю эту строку, используя привязки 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";
}
...