Erste WPF-ListView.SelectedItems im ViewModel
Gibt es einige Beiträge der Diskussion hinzufügen von Daten-Bindungsfähigkeit für ListView.SelectedItems
mit nicht-triviale Menge code. In meinem Szenario, das ich nicht brauche, um es aus der ViewModel
, immer nur der ausgewählten Elemente, um die Aktion auf Sie, und es wird ausgelöst durch den Befehl also push update ist auch nicht notwendig.
Gibt es eine einfache Lösung (im Sinne von code-Zeilen), vielleicht in der code-behind? Ich bin in Ordnung, mit code-behind-solange View
und ViewModel
müssen nicht aufeinander verweisen. Ich denke, das ist eine allgemeinere Frage: "best practice für die VM, um Daten aus der View-on-demand -", aber ich kann nicht scheinen, nichts zu finden...
InformationsquelleAutor NS.X. | 2012-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um die
SelectedItems
nur, wenn ein Befehl ausgeführt wird, dann verwenden SieCommandParameter
und pass in dieListView.SelectedItems
.SelectedItems
(plural) nicht unterstützt data-binding. Siehe diesen link und diesen link. Es funktioniert nicht wieCommandParameter
entweder, ich bekomme immernull
während der VerwendungSelectedItem
(singular) ist in Ordnung.Ich wusste gar nicht, dass
SelectedItems
hat keine Unterstützung für verbindlich. Ich entfernt, dass aus der Antwort. Aber dieCommandParameter
funktioniert, ich habe es getestet und war in der Lage, um die Liste der ausgewählten Elemente.Mein XAML-Beispiel zeigt einen
ListBox
aber ich habe das auch getestetListView
als gut und war in der Lage, die ausgewählten Elemente aus dem Befehls-parameter.Ich glaube, ich bin zu schlagen, diese CommandParameter bug was ist der Streit zu umgehen. Idealerweise aber Ihre Antwort ist der richtige Weg zu gehen.
Wirklich vielen Dank für die Bereitstellung dieses CommandParamter Lösung. Funktionierte großartig für mich
InformationsquelleAutor
Dies kann erreicht werden durch die Interaktion auslöst, wie unten
Müssen Sie auf Verweis hinzufügen, um
Microsoft.Ausdruck.Wechselwirkungen
System.Windows.Interaktivität
Füge unten xmlns für xaml
Fügen Sie folgenden code einfach in Ihrem GridView tag
Code im ViewModel deklariert Eigenschaft unter
innerhalb Konstruktor von Viewmodel-initialize-Befehl wie unten
InformationsquelleAutor
Ich glaube nicht, dass es richtig ist-Zustand zu berücksichtigen, dass " View und ViewModel nicht kennen'; In MVVM view immer wissen, über das ViewModel.
Habe ich auch in dieser Art von situation, wo ich für den Zugriff auf ViewModel in Anbetracht der code hinter, und füllen Sie anschließend einige Daten(wie die ausgewählten Elemente), dies wird notwendig, während bei Verwendung von 3'rd party-Steuerelemente wie ListView, DataGrid, etc.
Wenn direkt die Bindung des VM-Eigenschaft nicht möglich ist, dann würde ich hören ListViw.SelectionChanged-Ereignis und dann update meine ViewModels SelectedItems-Eigenschaft in diesem Fall.
Update:
Aktivieren VM-ziehen Sie Daten aus der Ansicht, Sie können verfügbar machen eine Schnittstelle für die Sicht, mit Ansicht-spezifische Funktionalität und ViewModel wird Bezug deiner Ansicht durch, dass die Schnittstelle, die Über eine Schnittstelle hält immer noch die Ansicht und ViewModel weitgehend entkoppelt, aber ich genrally nicht bevorzugen.
MVVM, bietet die Association of View, ViewModel
Ich würde trotzdem lieber den Ansatz weiter, der Umgang mit der Veranstaltung im Blick und halten die VM aktualisiert(mit der ausgewählten Elemente), auf diese Weise VM brauchen nicht zu sorgen über ziehen der Daten vor der Ausführung jeder operation, es muss lediglich die Verwendung der Daten zur Verfügung(wird immer aktualisiert).
SelectionChanged
Ereignis ist nicht gerade notwendig, da das ViewModel nur braucht, um die ausgewählten Elemente, wenn ein Befehl ausgeführt wird. Es ist mehr wie "Wie kann die VM ziehen Daten aus der View-on-demand".InformationsquelleAutor
Kann ich Ihnen versichern: SelectedItems ist ja bindbar als XAML - CommandParameter
Nach viel Graben und googeln, habe ich endlich eine einfache Lösung für dieses gemeinsame Problem.
Damit es funktioniert, müssen Sie befolgen Sie ALLE der folgenden Regeln:
Folgenden Ed Balls Vorschlag', auf Sie XAML-Befehl Datenbindung definieren CommandParameter Eigentum VOR Befehl Eigenschaft. Dies ist ein sehr zeitaufwendiger Fehler.
Stellen Sie sicher, dass Ihre ICommand's CanExecute und Ausführen Methoden haben einen parameter vom Objekt geben. Auf diese Weise können Sie verhindern, dass zum schweigen gebracht cast Ausnahmen, die tritt auf, wenn databinding CommandParameter - Typ stimmt nicht überein-Befehl-Methode der parameter-Typ.
Zum Beispiel, können Sie entweder senden Sie bitte eine listview/listbox ist SelectedItems Eigenschaft, um Sie ICommand Methoden oder das listview/listbox selbst. Toll, nicht wahr?
Hoffe, dass es verhindert, dass jemand zu verbringen, die riesige Menge an Zeit, die ich habe, um herauszufinden, wie erhalten SelectedItems als CanExecute parameter.
InformationsquelleAutor
Da keine der anderen Antworten hat mir geholfen (mit
SelectedItems
alsCommandParameter
war immernull
), hier ist eine Lösung für den Universellen Windows-Platform (UWP) apps. Es arbeitet mitMicrosoft.Xaml.Interactivity
undMicrosoft.Xaml.Interactions.Core
.Hier ist der Ansicht:
Hier ist das ViewModel (
RelayCommand
ist eine Klasse von MVVM Light):Beachten Sie, dass wenn Sie entfernen Sie Elemente aus der ursprünglichen Sammlung, nachdem die Auswahl abgeschlossen ist (der Benutzer drückt eine Taste, usw.), es wird auch entfernen Sie die Elemente aus Ihrem
_selectedItems
Liste! Wenn Sie dies tun, in einer foreach-Schleife haben, erhalten Sie eineInvalidOperationException
. Um dies zu vermeiden, fügen Sie einfach eine Wache in der markierten Stelle wie:und dann in der Methode, wo Sie zum Beispiel den Artikel zu entfernen, tun Sie dies:
InformationsquelleAutor