Wie finde ich heraus, ob es mit der Maus oder mit der Taste ausgewählt wurde?

8

Ich habe MVVM-Anwendung mit einem WPF-TreeView auf der linken Seite eines Fensters. Ein Detailbereich auf der rechten Seite ändert den Inhalt abhängig vom ausgewählten Baumknoten.

Wenn der Benutzer einen Knoten auswählt, ändert sich der Inhalt des Detailbereichs sofort. Dies ist erwünscht, wenn der Benutzer auf den Knoten geklickt hat, aber ich möchte den Inhalt ändern, wenn der Benutzer den Baum mit der Taste nach unten / oben navigiert. (Gleiches Verhalten wie Windows Explorer, zumindest unter Win XP) Ich nehme an, ich muss in meinem ViewModel wissen, ob der Knoten mit der Maus oder der Tastatur ausgewählt wurde.

Wie kann ich das erreichen?

Aktualisierung:

Dies ist mein erster Beitrag, daher bin ich mir nicht sicher, ob dies der richtige Ort ist, aber ich möchte der Community mitteilen, was ich in der Zwischenzeit getan habe. Hier ist meine eigene Lösung. Ich bin kein Experte deshalb weiß ich nicht, ob es eine gute Lösung ist. Aber es funktioniert für mich und ich würde mich freuen, wenn es anderen hilft. Bugfixes, Verbesserungen oder bessere Lösungen werden sehr geschätzt.

Ich habe unterhalb der angehängten Eigenschaft HasMouseFocus ... erstellt (Zuerst habe ich das MouseEnterEvent verwendet, aber das funktioniert nicht gut, wenn der Benutzer den Baum mit der Taste hoch / runter navigiert und der Mauszeiger zufällig über ein navigiertes Baumelement ist, da in diesem Fall die Details sofort aktualisiert werden.)

%Vor%

... und auf den TreeView.ItemContainerStyle

angewendet %Vor%

Wo Eigenschaften ist der Pfad meiner angehängten Eigenschaft.

%Vor%

Wenn in meinem ViewModel HasMousefocusProperty zutrifft, aktualisiere ich das Detailfenster (GridView) sofort. Wenn false, starte ich einfach einen DispatcherTimer und wende das aktuell ausgewählte Objekt als Tag an. Nach einem Intervall von 500ms wendet das Tick-Event die Details an, aber nur, wenn das ausgewählte Element immer noch dasselbe ist wie das Tag.

%Vor%     
AelanY 17.06.2012, 08:48
quelle

1 Antwort

2

Sie können das OnPreviewKeyDown für Ihr TreeView (oder das Benutzersteuerelement, das es hat) verarbeiten und programmgesteuert ein Flag in Ihrem ViewModel festlegen und es beim Aktualisieren des Detailbereichs berücksichtigen -

%Vor%

Ein ähnlicher Ansatz und andere Lösungen werden in dieser SO-Frage erwähnt -

Wie kann ich programmgesteuert navigieren? (nicht auswählen, sondern navigieren) ein WPF TreeView?

Update: [Als Antwort auf AalanYs Kommentar]

Ich glaube nicht, dass es irgendwelche Probleme mit Code-Behind in Ansichten gibt, die MVVM nicht kaputt machen.

In dem Artikel WPF-Apps mit dem Model-View-ViewModel-Designmuster , dem Autor, der Josh Smith ist, sagt:

  

In einer gut konzipierten MVVM-Architektur ist der Codebehind für die meisten Ansichten   sollte leer sein, oder höchstens Code enthalten, der die   Steuerelemente und Ressourcen, die in dieser Sicht enthalten sind. Manchmal ist es   Außerdem ist es notwendig, Code in einem Views Code-Behind zu schreiben, der interagiert   mit einem ViewModel-Objekt, wie das Anhängen eines Ereignisses oder das Aufrufen einer Methode   das wäre sonst sehr schwer vom ViewModel aus aufzurufen   sich selbst.

Nach meiner Erfahrung ist es unmöglich, eine Anwendung von beträchtlicher Größe zu erstellen, ohne Code-Behind, besonders wenn Sie komplexe Steuerelemente wie TreeView, DataGrid oder 3rd Party Controls verwenden müssen.

    
akjoshi 17.06.2012 12:01
quelle

Tags und Links