Ponieważ żaden z pozostałych odpowiedzi pomógł mi (za pomocą SelectedItems
jak CommandParameter
był zawsze null
), tutaj jest rozwiązanie dla Universal platforma Windows (UWP) aplikacji. Działa z użyciem Microsoft.Xaml.Interactivity
i .
Oto Widok:
<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>
Oto ViewModel (RelayCommand
jest klasa z MVVM Światła):
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;
}
}
Pamiętaj, że jeśli masz zamiar usunąć elementy z oryginalnej kolekcji po wybór jest zakończony (użytkownik naciska przycisk itp.), usunie również pozycje z listy _selectedItems
! Jeśli zrobisz to w pętli foreach, dostaniesz InvalidOperationException
. Aby tego uniknąć, wystarczy dodać strażnika w zaznaczonym miejscu jak:
if (_deletingItems)
return;
a następnie w sposobie, w którym na przykład usunięcia pozycji, wykonaj następujące czynności:
_deletingItems = true;
foreach (var item in _selectedItems)
YourOriginalCollection.Remove(item);
_deletingItems = false;
'SelectedItems' (liczba mnoga) nie obsługuje wiązania danych. Zobacz [ten link] (http://stackoverflow.com/questions/803216/managing-multiple-selections-with-vvm) i [ten link] (http://social.msdn.microsoft.com/forums/en- US/wpf/thread/edd335ea-e5e1-48e1-91a2-793d613f5cc3 /). Nie działa również jako 'CommandParameter', zawsze otrzymuję' null', podczas gdy użycie 'SelectedItem' (w liczbie pojedynczej) jest w porządku. –
@ user986080 Nie zdawałem sobie sprawy, że 'SelectedItems' nie obsługuje wiązania. Usunąłem to z odpowiedzi. Jednak parametr 'CommandParameter' działa, przetestowałem go i udało mi się wyświetlić listę wybranych elementów. – evanb
Mój XAML przykład pokazuje 'ListBox', ale również testowałem' ListView' i był w stanie uzyskać wybrane elementy z parametru polecenia. – evanb