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?
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%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
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:
Sie können jetzt die ausgewählte TabItem
vom übergeordneten Ansichtsmodell wie folgt ändern:
Beachten Sie, dass, da diese Eigenschaft Daten an die TabItem.IsSelected
-Eigenschaft gebunden ist, dies aufgerufen wird ...:
... 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.
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.
(alternativ, je nachdem, wie Sie die Dinge eingerichtet haben, könnten Sie gegen SelectedItem
... binden)
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.
Tags und Links wpf c# mvvm design-patterns mvvm-light