2012-04-03 1 views
0

Я пытаюсь создать элемент управления вкладкой, в котором заголовок на TabItem привязан в текстовом поле, которое находится в контрольной таблице tabcontrol. как я могу это сделать посредством привязки в стиле?Binding TabItem Header to Textblock in Style?

Вот мой код:

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

ответ

0

Вы могли бы попытаться достичь этого либо с помощью 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}}"/> 
+0

Это, как я хотел пойти. Я попытался использовать Relative Source, но он не работает для TabItem. Если я изменил тип предка на «Окно» и «Путь к заголовку», он корректно отобразится. Не знаю, почему это не видно. – Farnsworth

+0

О, я не заметил. Он не работает, поскольку вы определяете его в шаблоне TabControl, а не в шаблоне TabItems. Таким образом, вы пытаетесь связать с TabControl через FindAncestor (хотя это ребенок, а не предок). Вы должны переместить код в шаблон TabItem. –

0

Это не использует шаблон управления, но демонстрирует связывание текстового поля в заголовок вкладки с помощью модели представления. Обратите внимание, что я использую подсветку MVVM (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; } 
} 
2

попробовать этот

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

 Смежные вопросы

  • Нет связанных вопросов^_^