2009-03-26 15 views
27

Estoy intentando construir una interfaz de usuario WPF que contenga un TabControl y un TextBlock.WPF TabControl Databinding

I desea enlazar estos dos controles a una colección subyacente de las instancias de la clase siguiente:

class PageModel 
{ 
    public string Title {get;set;} 
    public string TabCaption {get;set;} 
    public FrameworkElement TabContent {get;set} 
} 

de control La pestaña debe mostrar una ficha para cada inicialaeromodellos.

  • cabecera de cada ficha debe mostrar la propiedad TabCaption
  • El contenido de cada pestaña debe ser la propiedad TabContent.

El TextBlock debe mostrar el título de la pestaña actualmente seleccionada.

¿Cómo puedo lograr este resultado?

Respuesta

61
<TabControl x:Name="_tabControl" ItemsSource="{Binding PageModels}"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="TabItem"> 
      <Setter Property="Header" Value="{Binding TabCaption}"/> 
      <Setter Property="Content" Value="{Binding TabContent}"/> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 
<TextBlock Text="{Binding SelectedItem.Title, ElementName=_tabControl}"/> 
+1

Impresionante solución. Otra cosa útil es establecer el valor de encabezado en {título vinculante} y el valor de contenido en {vinculación}. Esto le permite usar solo un único modelo de vista por página con una propiedad de Título para el encabezado. – Wouter

7

También encontré otra solución a este here usando ItemTemplate y ContentTemplate.

también para cualquier novatos WPF como yo, después de algunos dolores de cabeza y frustración que se dieron cuenta de que la colección de modelos de página tiene que ser un ObservableCollection<PageModel> en lugar de un List<PageModel> o cualquier cambio en la lista no serán reflejados por las lengüetas (es decir, no se puede agregar o eliminar una pestaña si se trata de una lista).