C# [WPF] MVVM TabControl SelectedIndex aus ViewModel steuern

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hi Leute,

kennt jemand von euch eine Möglichkeit, wie ich den SelectedIndex eines TabControls aus dem ViewModel steuern kann?
Eigentlich wollte ich den Weg gehen, den SelectedIndex als Mode="OneWay" festzulegen. Normalerweise gehe ich diesen Weg
indem ich an ein Command binde. Das gibt es hier nun nicht.
Habt ihr ne Idee?

Achso, es geht darum, das ich beim klicken auf einen TabIndex zunächst Prüfe ob der der Tab verlassen werden darf. Und nur wenn dies der Fall ist soll der Klick ausgeführt werden.
 
Sicher dass es nicht mit dem Binding geht?
Hab auf der Arbeit ein Projekt wo SelectedIndex an das ViewModel gebunden ist. Mode ist aber TwoWay und UpdateSourceTrigger PropertyChanged.

Wenn Du im Setter vom ViewModel die Prüfung machst, den Wert nicht übernimmst und dann ein PropertyChanged Event wirfst, dann sollte der Tab Index wieder zurückspringen.
 
Hi,
so etwas ähnliches hatte ich bereits probiert. Allerdings ohne dem UpdateSourceTrigger=PropertyChanged.
Leider geht es trotzdem nicht. Klar der Index wird gesetzt, aber in der Oberfläche bleib der Tab stehen.

Hier mal mein Property-Code wie er grob aussieht:
C#:
public int SelectedTabIndex
{
    get
    {
        return this.selectedTabIndex;
    }
    set
    {
        var x = this.selectedTabIndex;
        if (this.SetProperty(ref this.selectedTabIndex, value))
        {
            if (x == 1 && CheckSomething())
            {
                this.SetProperty(ref this.selectedTabIndex, 1);
            }
        }
    }
}

Und das XAML-Gegenstück:
XML:
<TabControl Style="{StaticResource IrgendEinStyle}"
            SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</TabControl>

Setze ich den selectedTabIndex nicht und werfe ein PropertyChanged manuell funktioniert es auch nicht.
 
Also ehrlich gesagt keine Ahnung warum du das mit SetProperty machst, bei mir sieht das so aus:

C#:
// Property
public int SelectedTab
{
    get => _selectedTab;
    set
    {
        if (value == _selectedTab) return;
        _selectedTab = value;
        RaisePropertyChanged();
    }
}

// Tabwechsel im Code mit einem eigenen Enum
SelectedTab = (int) TabType.General;
// alternativ:
SelectedTab = 1;
XML:
<TabControl SelectedIndex="{Binding SelectedTab}"/>

Damit funktioniert das prächtig. Wenn man von anderen Kontexten darauf zugreifen will muss man etwas tricksen, das hab ich bei mir wenn ich in den verschiedenen ViewModels, die in den Tabs selbst unabhängig voneinander liegen, auf die Tabs zugreifen will. Aber so im Allgemeinen geht das damit.

Um genauer drauf zu gucken müsste man dann deine genaue Codestruktur kennen.
 
  • Gefällt mir
Reaktionen: SomeDifferent
Der springende Punkt wird wahrscheinlich die fehlende INotifyPropertyChanged Implementation sein.
 
Zurück
Oben