2010-10-30 39 views
31

Solo quiero entender el siguiente escenario. Donde estoy poniendo en práctica un <TabControl> unido a un plantillas Sin datos ObservableCollection<TabViewModel>WPF: TabControl & DataTemplates

Cuando yo no tengo ningún DataTemplate s, el texto WpfApplication1.TabViewModel aparece en el encabezado Tab y contenido. Ok, entiendo esta parte.

Sólo ItemTemplate

Cuando acabo de

<TabControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding TabTitle}" /> 
     </StackPanel> 
    </DataTemplate> 
</TabControl.ItemTemplate> 

Luego se llena el encabezado de mi ficha. El contenido de la pestaña sigue siendo WpfApplication1.TabViewModel.

Sólo DataTemplate

Cuando sólo tengo el siguiente en mi <Window.Resources>

<DataTemplate DataType="{x:Type local:TabViewModel}"> 
    <TextBox Text="{Binding Text}" /> 
</DataTemplate> 

que las plantillas se llena la cabecera pestaña.

Tanto

Cuando tengo tanto, la ItemTemplate llena la pestaña Cabecera mientras que el DataTemplate llena el contenido de pestaña. Por qué toda esta diferencia ItemTemplate & DataTemplate llena el encabezado de tabulación si el otro no está presente. Si ambos están presentes, ItemTemplate llena el encabezado mientras DataTemplate llena el contenido.

Aunque tengo cosas que funcionan, estoy bastante confundido. ¿No debería ser algo como <TabControl.HeaderTemplate> lo que llena el encabezado y <TabControl.ItemTemplate> llenar el contenido?

Respuesta

50

En primer lugar, hay dos plantillas que participan aquí:

  • TabControl.ItemTemplate, que se utiliza para hacer las TabItem cabeceras
  • TabControl.ContentTemplate, que se utiliza para hacer las TabItem contenidos

Si no' Establezca estas propiedades explícitamente, luego WPF intentará resolverlas en otro lugar. Recorrerá el árbol lógico en busca de un recurso que le diga cómo renderizar su modelo de vista. Si encuentra un DataTemplate que tiene un DataType coincidente pero no tiene una clave, lo usará para representar el modelo de vista. Si no encuentra uno, se usará de forma predeterminada para representar el valor ToString del objeto.

lo tanto, si quieres ser explícita, que desea algo como esto:

<TabControl ItemsSource="{Binding Tabs}"> 
    <TabControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding TabTitle}"/> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}"/> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

Dado que usted no está siendo específica, WPF está tratando de subir su árbol lógico encontrar una adecuada DataTemplate. Cuando lo encuentra, lo usa para representar el modelo de vista.Donde no lo encuentra, llama al ToString y lo renderiza.

Así que para hacer frente a sus casos específicos:

Sólo ItemTemplate

Usted ha declarado explícitamente cómo representar los encabezados de la ficha, pero no contenido de la pestaña. Por lo tanto, el primero se procesa utilizando el DataTemplate provisto, pero el último se configurará por defecto en ToString.

Sólo DataTemplate

No se ha declarado explícitamente el modo de hacer cualquiera de los encabezados de la ficha o contenido de la pestaña. Por lo tanto, WPF busca un DataTemplate apropiado para ambos. Dado que ambos contienen una instancia de su modelo de vista (es decir, su DataContext), se usará el mismo DataTemplate para representar los encabezados de las pestañas y sus contenidos.

NOTA: no indicó explícitamente que esto es lo que está sucediendo en su pregunta. Corrígeme si estoy equivocado.

Tanto

En este caso, se han declarado explícitamente cómo representar los encabezados de la ficha, pero no contenido de la pestaña. Por lo tanto, el DataTemplate explícito se utiliza para los encabezados de pestañas y el DataTemplate implícito se utiliza para los contenidos de pestañas.

+0

Si quiero el cuadro de lista con el contenido y el elemento de control de pestaña, la fuente tendrá la lista de elementos para el cuadro de lista ... ¿Qué puedo hacer para esto? El cuadro de lista también tiene una plantilla de datos con él – Programmer

+0

"Antes que nada, hay dos plantillas involucradas aquí ..." ¡Argh! Se podría pensar que la forma en que se especifica un TabItem fuera de un DataTemplate funciona de la misma manera en una propiedad TabControl ItemTemplate, ya que ListView et al. trabaja de esta manera ¡Gracias! – user1454265

Cuestiones relacionadas