2010-08-15 2 views
8

Das folgende Beispiel xaml bewirkt, dass jedes Tab-Element den gleichen TextBox verwendet. Es macht Sinn, auf einer Ebene, denke ich ... aber es ist unerwartetes Verhalten und fühlt sich fast wie ein Käfer an. Und ich konnte keine Informationen in den Dokumenten finden, die das Verhalten erklären oder wie man es richtig umgehen kann.TabControls TabItems teilen denselben Inhalt ... Nicht erwünscht

<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> 

Wenn zwischen tab1 und tab2 Schalt wird die gleiche TextBox verwendet, wenn ich eine neue TextBox für jeden Reiter erwarten. Wie kann ich den letzteren Fall bekommen?

Das Unterklassifizieren von TabItem und das Vornehmen einer TextBox als Inhalt ist eine Möglichkeit, aber ich möchte nur sicher sein, dass es etwas gibt, das mir fehlt.

bearbeiten

Ich weiß, dass für jeden Reiter den Inhalt explizit Einstellung wird das Problem lösen, aber die Registerkarten sind dynamisch erstellt werden. Ich möchte die Inhaltsvorlage verwenden, damit ich neue Registerkarten über die Datenbindung hinzufügen kann und den Inhalt nicht teilen kann, da dies zu merkwürdigem Verhalten führt.

Vielleicht gibt es bei der aktuellen Implementierung des TabControl keinen deklarativen Ansatz, um dies zu lösen. Es ist ziemlich trivial, den Inhalt im Code zu setzen, aber solche Dinge fühlen sich in WPF immer falsch an. Das scheint mir eine ungerechtfertigte Optimierung des TabControl zu sein; Für Situationen, in denen dies nicht praktikabel ist, sollte es zumindest optional sein.

+0

Was ist Ihr Ziel? Ich bin sicher, dass wir eine Lösung für Ihr Problem auf eine andere Weise finden können, sobald wir das wissen =) – hkon

+2

Ich habe keine gute Lösung für dieses Problem, aber ich bin wirklich an den Antworten interessiert, die auftauchen könnten. .. Dieses Verhalten ist ein echter Schmerz. Manchmal macht es Sinn, dass die Inhaltsvorlage zwischen Tabs geteilt wird, aber sehr oft nicht, normalerweise, wenn Sie eine Dokumentschnittstelle mit Registerkarten erstellen –

+0

@hkon: Ich möchte, dass jede Registerkarte ihren eigenen Inhalt hat, wie in der Vorlage definiert Teilen einer einzigen Instanz zwischen den Tabs. Die Datenbindung sorgt dafür, dass gebundene Daten zwischen Tabs synchron gehalten werden. Dies kann jedoch zu Problemen führen. Möglicherweise hat der Benutzer eine Bildlaufleiste in einer Registerkarte angepasst, und seine Position wird dann nach dem Zurückschalten vergessen. – Siege

Antwort

4

Ich vermute, es gibt eine schönere Art und Weise zu erreichen, was auch immer es ist, dass Sie erreichen wollen, aber ich denke, dies funktionieren wird (würde testen, aber ich bin auf 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, das sah vielversprechend aus ... leider wird jedes Mal, wenn eine Registerkarte ausgewählt wird, ihr alter Inhalt mit einer neuen leeren TextBox überschrieben. – Siege

+0

+1 sowieso, um mich auf das "Shared" -Attribut aufmerksam zu machen: P – Siege

0

Es wird funktionieren wenn Sie ein Benutzersteuerelement definieren, in dem der Tab-Inhalt enthalten ist. Ich habe die folgende 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> 

Dann habe ich mein Fenster XAML dies sein geändert:

<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> 

Das ist nicht genau sein kann, was Sie wollen, aber zumindest das Layout der einzelnen Register ist nur An einer Stelle definiert und Sie können dann jeder Benutzersteuerung einen Datenkontext zuweisen, um die Werte für jede Ihrer Registerkarten anzuzeigen.

+0

Das löst das Problem nicht, das ich illustrierte. Das UserControl ist hier auch sinnlos, denn wenn Sie den Inhalt wie hier eingestellt haben, wird er mit einer einfachen alten TextBox arbeiten; Das Problem besteht darin, dass die Inhaltsvorlage dazu führt, dass Inhalt zwischen Tabs freigegeben wird, deren Inhalt nicht explizit festgelegt ist. Ich habe jedoch versucht, ein UserControl in der Vorlage zu verwenden, um zu sehen, ob es einen Unterschied machen würde, aber wie erwartet, tat es nicht. Ich aktualisierte meine Frage, um klarer zu sein. – Siege