Laden...

Templates in einem TabControl umschalten

Erstellt von Caveman vor 4 Jahren Letzter Beitrag vor 4 Jahren 787 Views
Caveman Themenstarter:in
187 Beiträge seit 2009
vor 4 Jahren
Templates in einem TabControl umschalten

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:

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

    public class CcMainViewModel : CcViewModelBase
    {
        public ObservableCollection<CcPlayerViewModel> Players { get; set; }
    }
    public class CcPlayerViewModel : CcViewModelBase
    {
        public CcLoginViewModel Login { get; set; }
    }
    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();
                }
            }
        }
    }

5.657 Beiträge seit 2006
vor 4 Jahren

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.

Weeks of programming can save you hours of planning

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 4 Jahren

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.