La vinculación en ItemContainerStyle funciona, la vinculación en DataTemplate no, ¿cómo solucionarlo?

Tengo un control de pestaña personalizado, que muestra un marco dentro de TabItem y un encabezado personalizado. Configurar el enlace en ItemContainerStyle para mostrar el TabItem funciona, pero no puedo obtener el enlace en DataTemplate para configurar el texto del encabezado para que funcione correctamente. Tenga en cuenta que TabControl está vinculado a una colección de elementos ObservableCollection, que contiene dos propiedades: TI, el marco que se mostrará en TabItem y DisplayName, la cadena que se mostrará en el encabezado.

=============== XAML ================

<TabControl Height="Auto" Name="mainTabControl" Width="Auto" IsSynchronizedWithCurrentItem="True" Margin="4" >
  <TabControl.ItemTemplate>
    <DataTemplate>
      <DockPanel Width="Auto">
        <Button 
            Content="X"
            Cursor="Hand"
            DockPanel.Dock="Right"
            Focusable="False"
            FontFamily="Courier" 
            FontSize="9"
            FontWeight="Bold"  
            Margin="0,1,0,0"
            Padding="0"
            VerticalContentAlignment="Bottom"
            Width="16" Height="16"               
            >
          <!-- Command=""      //Command binding TBD later
            CommandParameter="" -->
        </Button>
        <ContentPresenter 
            Content ="{Binding DisplayName}"
            VerticalAlignment="Center" 
            Margin="0,0,7,0"
          />
      </DockPanel>
    </DataTemplate>
  </TabControl.ItemTemplate>

  <TabControl.Style>
    <Style TargetType="TabControl">
      <Style.Triggers>
        <DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}"
                        Value="0">
          <Setter Property="Visibility" Value="Hidden" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TabControl.Style>
  <TabControl.ItemContainerStyle  >
    <Style TargetType="TabItem">
      <Setter Property="Content" Value="{Binding TI}"/>
    </Style>
  </TabControl.ItemContainerStyle>
</TabControl>

============ ARTÍCULO VINCULADO =============

  class TabItemContainer : Frame
  {
    public event DependencyPropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
      if (PropertyChanged != null)
      {
        PropertyChanged(this, new DependencyPropertyChangedEventArgs());
      }
    }

    private string displayname;

    public string DisplayName
    {
      get { return displayname; }
      set
      {
        if (value != this.displayname)
        {
          displayname = value;
          NotifyPropertyChanged("DisplayName");
        }
      }
    }

    public Frame TI { get; set; }
  }

=========== CÓDIGO DETRÁS =============

ObservableCollection<TabItemContainer> Tablist;

public MainWindow()
{
  InitializeComponent();

  Tablist = new ObservableCollection<TabItemContainer>();

  TabItemContainer tic = new TabItemContainer();
  tic.DataContext = tic;
  tic.DisplayName = "Untitled";
  tic.TI = new Frame();
  tic.TI.Navigate(new Page1());
  Tablist.Add(tic);
  mainTabControl.ItemsSource = Tablist;
  mainTabControl.SelectedIndex = Tablist.Count - 1;
}

preguntado el 08 de noviembre de 11 a las 19:11

¿Qué quieres decir con "no funciona"? ¿Le da un error? ¿No aparece nada? Por lo que puedo ver, la unión que muestra DisplayName en el encabezado parece correcto y debería funcionar. -

Sin errores y no aparece nada. Debería mostrar "Sin título" en el encabezado de la pestaña. -

¿Ves al menos tu botón Cerrar? -

Sí, aparece el botón Cerrar. Si reemplazo ContentPresenter, Content to text, por ejemplo, "hola", hola se muestra en el encabezado de la pestaña. -

1 Respuestas

Agrega una Header vinculante a su estilo TabItem

<TabControl.ItemContainerStyle>
    <Style TargetType="TabItem">
        <Setter Property="Content" Value="{Binding TI}"/>
        <Setter Property="Header" Value="{Binding }" />
    </Style>
</TabControl.ItemContainerStyle>

El DataContext en su encabezado no se establece automáticamente en su TabItemContainer (Pensé que sí ... debe estar equivocado)

respondido 09 nov., 11:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.