Da keiner der anderen Antworten mir geholfen (mit SelectedItems
als CommandParameter
immer null
war), hier ist eine Lösung für Universal Windows-Plattform (UWP) Anwendungen. Es funktioniert mit Microsoft.Xaml.Interactivity
und Microsoft.Xaml.Interactions.Core
.
Hier ist die Aussicht:
<ListView x:Name="ItemsList">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="SelectionChanged">
<Core:InvokeCommandAction Command="{x:Bind ViewModel.SelectedItemsChanged}" />
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
<!-- content etc. -->
</ListView>
Hier ist das Viewmodel (RelayCommand
ist eine Klasse von MVVM Light):
private List<YourType> _selectedItems = new List<YourType>();
private RelayCommand<SelectionChangedEventArgs> _selectedItemsChanged;
public RelayCommand<SelectionChangedEventArgs> SelectedItemsChanged
{
get
{
if (_selectedItemsChanged == null)
_selectedItemsChanged = new RelayCommand<SelectionChangedEventArgs>((selectionChangedArgs) =>
{
// add a guard here to immediatelly return if you are modifying the original collection from code
foreach (var item in selectionChangedArgs.AddedItems)
_selectedItems.Add((YourType)item);
foreach (var item in selectionChangedArgs.RemovedItems)
_selectedItems.Remove((YourType)item);
});
return _selectedItemsChanged;
}
}
Passen Sie auf, wenn Sie Elemente aus der ursprünglichen Sammlung nach dem entfernen gehen Die Auswahl ist abgeschlossen (der Benutzer drückt einen Knopf usw.), es werden auch die Einträge aus Ihrer _selectedItems
Liste entfernt! Wenn Sie dies in einer foreach-Schleife tun, erhalten Sie eine InvalidOperationException
. Um dies zu vermeiden, fügen Sie einfach eine Wache in der markierten Stelle wie:
if (_deletingItems)
return;
und dann in dem Verfahren, in dem Sie zum Beispiel der Elemente entfernen, dies zu tun:
_deletingItems = true;
foreach (var item in _selectedItems)
YourOriginalCollection.Remove(item);
_deletingItems = false;
'SelectedItems' (Plural) unterstützt keine Datenbindung. Siehe [diesen Link] (http://stackoverflow.com/questions/803216/managing-multiple-selections-with-mvvm) und [diesen Link] (http://social.msdn.microsoft.com/forums/en- US/wpf/thread/edd335ea-e5e1-48e1-91a2-793d613f5cc3 /). Es funktioniert auch nicht als 'CommandParameter', ich bekomme immer' null', während 'SelectedItem' (singular) in Ordnung ist. –
@ user986080 Ich habe nicht erkannt, dass 'SelectedItems' die Bindung nicht unterstützt. Ich habe das aus der Antwort entfernt. Wie auch immer, der 'CommandParameter' funktioniert, ich habe ihn getestet und konnte die Liste der ausgewählten Elemente anzeigen. – evanb
Mein XAML-Beispiel zeigt eine 'ListBox', aber ich habe auch eine' ListView' getestet und konnte die ausgewählten Elemente vom Befehlsparameter abrufen. – evanb