从动态填充tabcontrol获取TabItem标题

从动态填充tabcontrol获取TabItem标题

问题描述:

我有一个tabcontrol从一个observablecollection填充。基于observablecollection,tabitems头文件被设置,tabitem中的数据网格被填充。我想要做的是获得tabitem标题并将其设置在文本块中。我能够获得tabcontrol名称并将其设置为文本块文本,而不是来自所选tabitem的页眉。从动态填充tabcontrol获取TabItem标题

<TabControl Grid.Row="1" ItemsSource="{Binding Workspaces}" Height="Auto" Background="Transparent" x:Name="TabsName" > 
        <TabControl.Resources> 
         <localHelper:HeaderAppendConverter x:Key="HeaderAppedConvrter"/> 
        </TabControl.Resources> 
        <TabControl.ItemTemplate > 
         <DataTemplate > 
          <TextBlock Text="{Binding HeaderText}" /> 
         </DataTemplate> 
        </TabControl.ItemTemplate> 

        <TabControl.ContentTemplate> 
         <DataTemplate x:Name="Tabsitems"> 
          <Grid> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="50"/> 
            <RowDefinition Height="725" /> 
           </Grid.RowDefinitions> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="1600" /> 
           </Grid.ColumnDefinitions> 
           <dxg:GridControl Grid.Row="1" x:Name="NameGrid" ItemsSource="{Binding Data}" > 
            <dxgcore:GridControl.Columns> 

             <dxg:GridColumn Name="Month1" FieldName="Month01" Visible="True" AllowEditing="False" HorizontalHeaderContentAlignment="Center" CellStyle="{StaticResource NumberCellStyle}"> 
              <dxg:GridColumn.EditSettings> 
               <dxe:TextEditSettings HorizontalContentAlignment="Right" /> 
              </dxg:GridColumn.EditSettings> 
              <dxg:GridColumn.Header> 
               <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}, Path=SelectedItem.Header, Converter={StaticResource HeaderAppendConverter}, ConverterParameter='01'}" /> 
              </dxg:GridColumn.Header> 

             </dxg:GridColumn> 
              </dxg:GridColumn> 
            </dxgcore:GridControl.Columns> 
            <dxgcore:GridControl.View> 
             <dxgcore:TableView x:Name="NameGridView" 
             AllowEditing="False" 
             AllowBestFit="True" 
             AllowMoving="True" 
             AllowColumnFiltering="True" 
             IsColumnMenuEnabled="True" 
             ShowGroupPanel="False" 
             ShowAutoFilterRow="True" 
             AutoWidth="False" 
             NavigationStyle="Cell" 
             VerticalScrollbarVisibility="Visible" 
             HorizontalScrollbarVisibility="Visible" 
             RowStyle="{StaticResource customRowStyle}" > 
             </dxgcore:TableView> 
            </dxgcore:GridControl.View> 
           </dxg:GridControl> 

          </Grid> 
         </DataTemplate> 
        </TabControl.ContentTemplate> 
       </TabControl> 


public class WorkSpace : INotifyPropertyChanged 
{ 

    private string headerText; 
    public string HeaderText { get { return headerText; } set { headerText = value; OnPropertyChanged("HeaderText"); } } 

    public override string ToString() 
    { 
     return HeaderText; 
    } 

    private List<Data> data; 
    public List<Data> Data { get { return data; } set { data = value; OnPropertyChanged("Data"); } } 

此行

<TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}, Path=Name}" /> 

设置TabControl的名字到文本块我怎样才能改变这种状况,以获得所选择的TabItem的标题文字

+0

你能告诉我在XAML代码中的'TextBlock的地方吗? –

+0

@HenkaProgrammer xaml textblock在原来的帖子下面的“这行”表示该行显示tabcontrol名称 – ANewUser

+0

请问我如何在代码后面填充TabItems? –

流动的转换器添加到您的项目:

public class HeaderAppendConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return string.Format("{0}{1}",value, parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Binding.DoNothing; 
    } 
} 

然后添加到您的TabControl容器资源的StaticResource:

<local:HeaderAppendConverter x:Key="HeaderAppedConvrter"/> 

最后更新TextBlock;

<TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}, Path=SelectedItem.Header, Converter={StaticResource HeaderAppendConverter}, ConverterParameter=columnSuffix}" /> 
在ConverterParameter

,你可以通过你的自定义字符串

的完整的解决方案是这样的:

的解决方案结构是: Solution Struct

主窗口XAML代码:

<Window x:Class="Twest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:Twest" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <ResourceDictionary> 
     <local:HeaderAppendConverter x:Key="HeaderAppendConverter" /> 
    </ResourceDictionary> 
</Window.Resources> 
<Grid> 
    <TabControl Grid.Row="1" Height="Auto" Background="Transparent" x:Name="TabControlMainName"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding HeaderText}" /> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 

     <TabControl.ContentTemplate> 
      <DataTemplate x:Name="Tabsitems"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="50" /> 
         <RowDefinition Height="725" /> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="1600" /> 
        </Grid.ColumnDefinitions> 
        <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}, Path=SelectedItem.Header, Converter={StaticResource HeaderAppendConverter}, ConverterParameter= columnSuffix}" /> 
       </Grid> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 
</Grid> 

的主窗口后面的代码:

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 

namespace Twest 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Loaded += MainWindow_Loaded; 
    } 

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     List<TabItem> tabs = new List<TabItem>(); 
     tabs.Add(new TabItem() { Name = "tab1", Header = "TAB 01" }); 
     tabs.Add(new TabItem() { Name = "tab2", Header = "TAB 02" }); 
     TabControlMainName.ItemsSource = tabs; 
    } 
} 

}