myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » Templates in einem TabControl umschalten
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Templates in einem TabControl umschalten

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Caveman Caveman ist männlich
myCSharp.de-Mitglied

avatar-3854.jpg


Dabei seit: 18.10.2009
Beiträge: 130
Entwicklungsumgebung: VS2017P; VS2019P


Caveman ist offline

Templates in einem TabControl umschalten

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

In einem TabControl soll zu beginn auf jedem Tab immer ein Login erfolgen.

Dazu wird ein Usercontrol (CcLoginControl), das in einem DataTemplate eingebettet ist, dem ContentTemplate zugewiesen. Das ItemTemplate wird ebenfalls über ein DataTemplate realisiert.
Beide Templates sollen neu zugewiesen werden, wenn der Login auf dem jeweiligen Tab erfolgreich war. Mein Problem ist nun, dass ich nicht an den entsprechenden Datatrigger (Property IsRunningSession im ViewModel CcLoginViewModel) verweisen kann.
Der im Code dargestellte Datatrigger schaltet auf allen Tabs die Templates um. Es soll aber nur auf dem selektierten Tab der Austausch der Templates erfolgen.

XAML im Hauptfenster:

XML-Code:
    <Window.Resources>
        <DataTemplate x:Key="TabControlNewItemDataTemplate" DataType="{x:Type vm:CcPlayerViewModel}">
            <Grid>
                <TextBlock x:Name="ItemHeader" VerticalAlignment="Top" Text="+"></TextBlock>
            </Grid>
        </DataTemplate>
        <DataTemplate x:Key="PlayerTabItemTemplate" DataType="{x:Type vm:CcPlayerViewModel}">
            <Grid>
                <TextBlock x:Name="ItemHeader" VerticalAlignment="Top" Text="{Binding Login.Name}"></TextBlock>
            </Grid>
        </DataTemplate>

        <DataTemplate x:Key="LoginContentDataTemplate" x:Name="LoginTemplate" DataType="{x:Type vm:CcPlayerViewModel}">
            <local:CcLoginControl x:Name="LoginContentTemplate" DataContext="{Binding Login}" />
        </DataTemplate>
        <DataTemplate x:Key="PlayerContentDataTemplate" DataType="{x:Type vm:CcPlayerViewModel}">
            <local:CcPlayerControl x:Name="PlayerContentDataTemplate" DataContext="{Binding}" />
        </DataTemplate>

        <Style x:Key="TabControlStyle" TargetType="{x:Type TabControl}">
            <Setter Property="ContentTemplate" Value="{StaticResource LoginContentDataTemplate}" />
            <Setter Property="ItemTemplate" Value="{StaticResource TabControlNewItemDataTemplate}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Login.IsRunningSession, Source={StaticResource PlayerTabItemTemplate}}" Value="True">  <-- Binding?
                    <Setter Property="ContentTemplate" Value="{StaticResource PlayerContentDataTemplate}"
/>
                    <Setter Property="ItemTemplate" Value="{StaticResource PlayerTabItemTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding DataContext.Players/Login.IsRunningSession, ElementName=TabControlPlayers}" Value="False">  <-- Binding?
                    <Setter Property="ContentTemplate" Value="{StaticResource LoginContentDataTemplate}"
/>
                    <Setter Property="ItemTemplate" Value="{StaticResource TabControlNewItemDataTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Window.DataContext>
        <vm:CcMainViewModel x:Name="MainViewModel" />
    </Window.DataContext>

    <Grid>
        <TabControl Name="TabControlPlayers"
                    ItemsSource="{Binding Players}"
                    Style="{DynamicResource TabControlStyle}"
/>
    </Grid>

ViewModels:

C#-Code:
    public class CcMainViewModel : CcViewModelBase
    {
        public ObservableCollection<CcPlayerViewModel> Players { get; set; }
    }

C#-Code:
    public class CcPlayerViewModel : CcViewModelBase
    {
        public CcLoginViewModel Login { get; set; }
    }

C#-Code:
    public class CcLoginViewModel : CcViewModelBase
    {
         public string Name
        {
            get { return name; }
            set
            {
                if (name != value)
                {
                    name = value;
                    OnPropertyChanged();
                }
            }
        }

        public string Password
        {
            get { return password; }
            set
            {
                if (password != value)
                {
                    password = value;
                    OnPropertyChanged();
                }
            }
        }

        public bool IsRunningSession
        {
            get { return isRunningSession; }
            set
            {
                if (isRunningSession != value)
                {
                    isRunningSession = value;
                    OnPropertyChanged();
                }
            }
        }
    }
16.01.2020 17:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.378
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du solltest die Templates so aufbauen, wie auch dein ViewModel organisiert ist. D.h., der Login ist Teil des Players. Dann kannst du innerhalb des Player-Templates den Login-Teil ein- oder ausblenden, je nachdem, ob das Flag im ViewModel gesetzt ist.
17.01.2020 09:46 Beiträge des Benutzers | zu Buddylist hinzufügen
Caveman Caveman ist männlich
myCSharp.de-Mitglied

avatar-3854.jpg


Dabei seit: 18.10.2009
Beiträge: 130
Entwicklungsumgebung: VS2017P; VS2019P

Themenstarter Thema begonnen von Caveman

Caveman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Du meinst, der DataType vom Template LoginContentDataTemplate muss CcLoginViewModel sein?

Ich werde das nochmals durchprobieren, obwohl ich mir sicher bin, dass ich das gestern schon gemacht habe.
17.01.2020 09:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Monate.
Der letzte Beitrag ist älter als 4 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 28.05.2020 14:24