2010-08-15 13 views
8

El ejemplo siguiente xaml hace que cada elemento de tabulación comparta el mismo cuadro de texto. Tiene sentido, en algún nivel, supongo ... pero es un comportamiento inesperado, y casi se siente como un error. Y no pude encontrar ninguna información en los documentos explicando el comportamiento o cómo solucionarlo correctamente.TabItems de TabControl que comparten el mismo contenido ... No querer

<TabControl> 
    <TabControl.Resources> 
     <Style TargetType="TabItem"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <TextBox /> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </TabControl.Resources> 
    <TabItem Name="tab1" /> 
    <TabItem Name="tab2" /> 
</TabControl> 

Al cambiar entre Tab1 y Sep2, se utiliza el mismo cuadro de texto, cuando yo esperaría un nuevo cuadro de texto para cada ficha. ¿Cómo puedo obtener el último caso?

Subclasificar TabItem y hacer que su contenido sea un TextBox por defecto es una forma de hacerlo, pero solo quiero asegurarme de que no me falta algo.

Editar

que darse cuenta que establecer explícitamente el contenido de cada pestaña va a resolver el problema, pero las pestañas se van a crear de forma dinámica. Quiero usar la plantilla de contenido para poder agregar pestañas nuevas mediante el enlace de datos y no compartir el contenido, ya que está causando un comportamiento peculiar.

Tal vez con la implementación actual de TabControl, no hay un enfoque declarativo para resolver esto. Es bastante trivial configurar el contenido en código, pero tales cosas siempre se sienten mal en WPF. Para mí, esto parece una optimización injustificada de TabControl; debería al menos ser opcional para situaciones donde no es práctico.

+0

¿Cuál es su objetivo? Estoy seguro de que podemos encontrar una solución a su problema de una manera diferente, una vez que sabemos que =) – hkon

+2

No tengo una buena solución para ese problema, pero estoy realmente interesado en las respuestas que puedan surgir. .. Este comportamiento es un verdadero dolor. A veces tiene sentido que la plantilla de contenido se comparta entre pestañas, pero a menudo no es así, generalmente cuando se hace una interfaz de documento con pestañas –

+0

@hkon: quiero que cada pestaña tenga su propio contenido como se define en la plantilla de compartir una sola instancia entre pestañas. El enlace de datos funciona para mantener los datos vinculados sincronizados entre pestañas, pero esto puede causar algunos problemas. Tal vez el usuario ajustó una barra de desplazamiento en una sola pestaña, y su posición se olvida luego de volver a ella. – Siege

Respuesta

4

Sospecho que hay una manera mejor de lograr lo que sea que está tratando de lograr, pero creo que esto va a funcionar (pondría a prueba, pero estoy en Linux atm):

<TabControl> 
    <TabControl.Resources> 
     <Style TargetType="TabItem" x:Shared="False"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <TextBox /> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </TabControl.Resources> 
    <TabItem Name="tab1" /> 
    <TabItem Name="tab2" /> 
</TabControl> 
+1

Ah, esto parecía prometedor ... desafortunadamente, cada vez que se selecciona una pestaña, su contenido anterior se sobrescribe con un nuevo TextBox vacío. – Siege

+0

+1 de todos modos para informarme sobre el atributo "Compartido": P – Siege

0

Funcionará si define un control de usuario que tiene el contenido de la pestaña en él. He creado la siguiente usercontrol:

<UserControl x:Class="SO_Testing.TextBoxUC" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <TextBox/> 
    </Grid> 
</UserControl> 

Luego he modificado mi xaml ventana para ser la siguiente:

<Window x:Class="SO_Testing.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:SO_Testing" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TabControl> 
      <TabItem Name="tab1" Header="Test"> 
       <local:TextBoxUC/> 
      </TabItem> 
      <TabItem Name="tab2" Header="Test 2"> 
       <local:TextBoxUC/> 
      </TabItem> 
     </TabControl> 
    </Grid> 
</Window> 

Esto puede no ser exactamente lo que está deseando, pero al menos la disposición de cada ficha sólo definido en un lugar y luego puede asignar un contexto de datos a cada control de usuario para mostrar los valores de cada una de sus pestañas.

+0

Esto no resuelve el problema que estaba ilustrando. El UserControl aquí tampoco tiene sentido, porque si configuras específicamente el contenido como lo hiciste aquí, funcionará con un TextBox viejo y simple; el problema es que la plantilla de contenido hace que el contenido se comparta entre las pestañas cuyo contenido no está establecido explícitamente. Sin embargo, traté de usar un UserControl en la plantilla para ver si podía hacer alguna diferencia pero, como era de esperar, no fue así. Actualicé mi pregunta para ser más clara. – Siege

Cuestiones relacionadas