So ändern Sie die Registerkarte von TabControl in WPF, ohne das MVVM-Muster zu verletzen

7

Mein WPF-Windows enthält ein TabControl, das Inhalte auf verschiedenen Registerkarten anzeigt. Ein Klick auf die Schaltfläche unten führt eine Methode über die ICommand-Schnittstelle / Binding aus. Die aufgerufene Methode generiert Text, der auf der zweiten Registerkarte angezeigt werden soll.

Wie kann ich beim Klicken auf die Schaltfläche auf die zweite Registerkarte wechseln, ohne das MVVM-Muster zu verletzen?

Ich habe versucht, die TabItem.IsSelected-Eigenschaft an etwas in meinem ViewModel zu binden, aber ich wollte auch die anderen Tabs (Tab1) verwenden.

Irgendwelche Gedanken?

    
Joel 06.03.2013, 16:48
quelle

5 Antworten

11

Ich habe es selbst herausgefunden.

Der Schlüssel ist eine Zwei-Wege-Bindung. Wenn auf die Schaltfläche geklickt wird, wird die Eigenschaft DisplayXamlTab true festgelegt. Das IsSelected -Attribut ist an diese Variable gebunden. Wenn auf eine andere Registerkarte geklickt wird, wird die DisplayXamlTab-Eigenschaft durch die Bindung auf false gesetzt.

Hinweis: UpdateSourceTrigger=PropertyChanged ist auch sehr wichtig

Code kommt unten:

XAML:

%Vor%

C # Eigenschaft:

%Vor%     
Joel 06.03.2013, 17:05
quelle
12

Wenn Sie die MVVM-Methode verwenden, werden Sie im hinterstehenden Code zwei Abhängigkeitseigenschaften erstellen:

  • ObservableCollection<ItemType> Items;
  • ItemType MySelectedItem;

Binden Sie anschließend die TabControl ItemsSource-Eigenschaft an die Elemente und binden Sie die SelectedItem-Eigenschaft an MySelectedItem

%Vor%

Wenn Sie die ausgewählte Registerkarte ändern möchten, aktualisieren Sie einfach die MySelectedItem-Abhängigkeitseigenschaft

    
sim1 06.03.2013 17:00
quelle
2

Obwohl diese Frage schon ziemlich alt und gut beantwortet ist, dachte ich, ich würde diese zusätzliche Antwort hinzufügen, um eine alternative Möglichkeit zu zeigen, die gewählte TabItem in TabControl zu ändern. Wenn Sie für jedes TabItem ein View-Modell haben, kann es hilfreich sein, eine IsSelected -Eigenschaft zu haben, um zu bestimmen, ob es ausgewählt ist oder nicht. Es ist möglich, diese Eigenschaft IsSelected mit der Eigenschaft TabItem.IsSelected über die Eigenschaft ItemContainerStyle zu binden:

%Vor%

Sie können jetzt die ausgewählte TabItem vom übergeordneten Ansichtsmodell wie folgt ändern:

%Vor%

Beachten Sie, dass, da diese Eigenschaft Daten an die TabItem.IsSelected -Eigenschaft gebunden ist, dies aufgerufen wird ...:

%Vor%

... wird automatisch auch die Eigenschaft MenuItems[0].IsSelected auf false setzen. Wenn für das Ansichtsmodell, mit dem Sie arbeiten, die Eigenschaft IsSelected auf true gesetzt ist, können Sie sicher sein, dass die zugehörige Ansicht in TabControl ausgewählt ist.

    
Sheridan 06.11.2014 21:11
quelle
1

Sie können eine Bindung zwischen dem Ansichtsmodell und der TabControl.SelectedIndex -Eigenschaft erstellen, d. h. 0 wählt die erste TabItem , 1 die zweite usw. aus.

%Vor%

(alternativ, je nachdem, wie Sie die Dinge eingerichtet haben, könnten Sie gegen SelectedItem ... binden)

    
JerKimball 06.03.2013 16:55
quelle
0

Sie werden wahrscheinlich eine Art " Event-Aggregator " -Muster (zB Messenger Klasse in MVVM Light), um eine Art "Navigations" -Nachricht zu senden. Ihre Ansicht - das TabControl - kann auf die spezifische Nachricht warten und zu Tab2 navigieren, wenn die Nachricht empfangen wird.

Alternativ können Sie die " SelectedItem " Eigenschaft des TabControl für Ihr ViewModel und rufen Sie einfach CurrentTab = MySecondTabViewModel von Ihrer VM aus auf. Dies ist der Ansatz , der von @HighPoint in den Kommentaren empfohlen wird das OP, aber ich bin kein Fan; siehe unten. Ein weiterer Nachteil dieses Ansatzes besteht darin, dass Sie mit DataTemplates vertraut sein müssen, da dies erforderlich ist Zu jedem ViewModel, das Sie anzeigen, eine Ansicht zuordnen.

Mir persönlich gefällt der erste Ansatz, weil ich es nicht für eine "Verantwortung" des ViewModels halte, die Tab-Navigation zu handhaben. Wenn Sie Ihre View nur dann alarmieren, wenn sich Daten in Ihrem ViewModel ändern, können Sie in der View entscheiden, ob sie Tabulatoren ändern möchte oder nicht.

    
BTownTKD 06.03.2013 16:53
quelle