Laden...

TabControl ItemTemplate 2 alternative DataTemplates (mit key)

Erstellt von sth_Weird vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.856 Views
S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 9 Jahren
TabControl ItemTemplate 2 alternative DataTemplates (mit key)

Hallo,

Kurzes Vorwort zu den Rahmenbedingingen: WPF Projekt, MVVM.
ich habe ein TabControl dessen ItemsSource an eine ObservableCollection<...> meines ViewModels gebunden ist. In der ObservableCollection können diverse Unter-ViewModels stecken, aber alle ViewModels haben hier die eine Gemeinsamkeit, dass sie ein Interface implementieren und daher ein Property ChildType (dahinter steckt eine Enumeration) haben.
Nun besteht ein TabItem ja aus einem Header und dem eigentlichen Inhalt. Im Moment habe ich es so, dass der Inhalt automatisch richtig angezeigt wird, da ich in den Resourcen DataTemplates hinterlegt habe für die jeweiligen ViewModels. Die Anzeige des Headers war bisher immer gleich, deshalb hatte ich das ganze so (gekürzt):


<TabControl Grid.Row="8" Grid.Column="1" ItemsSource="{Binding Path=Components, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Margin="10,2,5,2" HorizontalAlignment="Left" VerticalAlignment="top">
<TabControl.ItemTemplate>
                     <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Number}" />
                            <TextBlock Text="{Binding Text}" />
                        </StackPanel>
                    </DataTemplate>
                </TabControl.ItemTemplate>
            </TabControl>

Das hat funktioniert. Nun aber eine neue Anforderung: Abhängig vom Wert der ChildType-Property soll für das ItemTemplate ein anderes DataTemplate verwendet werden. Dachte erst das wäre ganz einfach und ich könnte einfach einen DataTrigger verwenden. Versucht, Compilerfehler...Unterhalb TabControl.ItemTemplate (FrameworkElement) kann man nur EventTrigger verwenden 😦
Wo muss ich nun den DataTrigger hinschreiben, damit es geht?
Ich habe die beiden DataTemplates schon mit keys in den TabControl-Resources angelegt. Wo muss ich nun den DataTrigger unterbringen, damit das richtige DataTemplate im Header angezeigt wird?
Ich habe schon versucht ein Style zu erstellen für TabItem und dort im Setter das TabItem.ItemTemplate zu überschreiben, hat aber leider nicht funktioniert 😦
Hier das Style in den TabControl Resources, in der Variante habe ich natürlich das TabControl.Item Template von oben rausgenommen:


<Style TargetType="TabItem">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=ChildType}" Value="Type1">
                                <Setter Property="TabControl.ItemTemplate" Value="{StaticResource Type1Template}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=ChildType}" Value="Type2">
                                <Setter Property="TabControl.ItemTemplate" Value="{StaticResource Type2Template}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>

Leider passiert dann garnichts bzw. das allgemeine ViewModel-DataTemplate wird nun sowohl für die Header als auch für den Content verwendet, als wäre das Style garnicht da oder würde nicht angewandt.
Schreibe ich das TabControl.ItemTemplate von oben wieder dazu, wird es wie zuvor immer so angezeigt.
Kann mir jemand sagen wo ich den Trigger hinpacken muss damit es funktioniert??? Wie gesagt das betrifft nur den Header der Inhalt soll weiterhin wie bisher automatisch angezeigt werden. Und das Template muss auch explizit mit key ausgewählt werden und es sind auch total unterschiedliche Templates, es wird nicht nur eine Farbe oder so ausgetauscht (sonst könnte man den Trigger ja direkt an das Control hängen...).

gruß & danke
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 9 Jahren
gelöst

nach Stunden vergeblicher Suche und Probieren hatte ich aufgegeben, nun hab ich kaum hier gepostet und prompt doch noch selbst bzw. auf einer bisher unentdeckten Seite eine Lösung gefunden (nuja so weit war ich ja garnicht entfernt, mein Style und das Ziel waren nur fehlplatziert und das ItemContainerStyle-Element hat außenrum gefehlt...)


<TabControl Grid.Row="8" Grid.Column="1" ItemsSource="{Binding Path=Components, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" Margin="10,2,5,2" HorizontalAlignment="Left" VerticalAlignment="top">
                <TabControl.Resources>
                    <DataTemplate x:Key="Type1Template">
                        ...                    </DataTemplate>
                    <DataTemplate x:Key="Type2Template">
                        ...                        </DockPanel>
                    </DataTemplate>
                    </TabControl.Resources>
                    <TabControl.ItemContainerStyle>
                    <Style TargetType="TabItem">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=ChildType}" Value="Type1">
                                <Setter Property="TabItem.HeaderTemplate" Value="{StaticResource Type1Template}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=ChildType}" Value="Type2">
                                <Setter Property="TabItem.HeaderTemplate" Value="{StaticResource Type2Template}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TabControl.ItemContainerStyle>
            </TabControl>

vielleicht brauchts ja irgendwann mal jemand...

gruß
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

3.170 Beiträge seit 2006
vor 9 Jahren

Hallo,

müsste eigentlich auch mit einem eigenen DataTemplateSelector als ItemTemplateSelector Deines TabContol funktionieren.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca