Привязка заголовка TabItem к текстовому блоку в стиле? - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь создать элемент управления вкладкой, в котором заголовок элемента TabItem связан в текстовом поле, которое находится в шаблоне элемента управления tabcontrol.Как я могу сделать это с помощью привязки в стиле?

Вот мой код:

<Style x:Key="TabControlTest1" TargetType="TabControl">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="TabControl">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>

                <!--Area for TabItems-->
                <Border Grid.Column="0"
                    Grid.Row="0"
                    >
                    <TabPanel IsItemsHost="True"
                        x:Name="HeaderPanel" 
                        Background="Transparent" />
                </Border>

                <!--Content of SelectedItems-->
                <Border Grid.Column="1" 
                     BorderBrush="{DynamicResource TabControlContentPresentBorderBrush}"
                     BorderThickness="0,1,1,1"
                     Background="{DynamicResource TabControlContentPresentBackgroundBrush}"
                     >
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <!--///This is Where I want to bind the Header///-->
                        <Label
                            Grid.Row="0"
                            Foreground="AliceBlue"
                            Content="{Binding Header, ElementName=TabItem}"/>
                        <ContentPresenter 
                            Grid.Row="1"
                            x:Name="PART_SelectedContentHost"
                            ContentSource="SelectedContent"
                            Margin="5"/>
                    </Grid>

                </Border>

    <ControlTemplate x:Key="TabItemControlTemplate" TargetType="{x:Type TabItem}">
            <!--Grid Defines Height and also hold content header-->
            <Grid>

                <Border Background="{DynamicResource TabItemContentPresentBackgroundBrush}"
                Margin="0,0,0,5">

                    <!--Content of TabItem will be rendered-->
                    <ContentPresenter 
                        x:Name="ContentSite" 
                        Margin="3"
                        HorizontalAlignment="Left" 
                        VerticalAlignment="Center" 
                        RecognizesAccessKey="True" 
                        ContentSource="Header"/>
                </Border>
            </Grid>
        </ControlTemplate>

            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Ответы [ 3 ]

2 голосов
/ 04 сентября 2012

попробуйте

<Label Grid.Row="0"
       Foreground="AliceBlue"
       Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TabControl}
       , Path=SelectedItem.Header}"/>
0 голосов
/ 03 апреля 2012

Это не использует шаблон элемента управления, но демонстрирует привязку текстового поля к заголовку вкладки через модель представления.Обратите внимание, что я использую MVVM light (ViewModelBase и Set ()), но вы можете при необходимости заменить его собственной поддержкой INotifyPropertyChanged.

enter image description here

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="ContentTemplate" DataType="{x:Type Samples:TabBindingViewModel}">
            <StackPanel>
                <TextBlock Text="{Binding MyContent}"/>
                <TextBox Text="{Binding Header}"/>
            </StackPanel>
        </DataTemplate>
    </Grid.Resources>

    <TabControl 
        ContentTemplate="{StaticResource ContentTemplate}" 
        DisplayMemberPath="Header" 
        ItemsSource="{Binding Items}" />
</Grid>

public class TabContentToHeaderViewModels : ViewModelBase
{
    private readonly ObservableCollection<TabContentToHeaderViewModel> _items;

    public TabContentToHeaderViewModels()
    {
        _items = new ObservableCollection<TabContentToHeaderViewModel>
                     {
                         new TabContentToHeaderViewModel(1),
                         new TabContentToHeaderViewModel(2),
                         new TabContentToHeaderViewModel(3),
                     };
    }

    public IEnumerable<TabContentToHeaderViewModel> Items
    {
        get { return _items; }
    }
}

public class TabContentToHeaderViewModel : ViewModelBase
{
    public TabContentToHeaderViewModel() : this(0)
    {
    }

    public TabContentToHeaderViewModel(int n)
    {
        Header = "I'm the header: " + n.ToString(CultureInfo.InvariantCulture);
        MyContent = "I'm the content: " + n.ToString(CultureInfo.InvariantCulture);
    }

    private string _header;
    public string Header
    {
        get { return _header; }
        set { Set(() => Header, ref _header, value); }
    }

    public string MyContent { get; set; }
}
0 голосов
/ 03 апреля 2012

Вы можете попытаться достичь этого, используя TemplateBinding или RelativeSource.TemplateBinding:

<Label Grid.Row="0"
       Foreground="AliceBlue"
       Content="{TemplateBinding Header}"/>

RelativeSource:

<Label Grid.Row="0"
       Foreground="AliceBlue"
       Content="{Binding Path=Header, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TabItem}}"/>
...