Поскольку ни один из ответов не помог мне (используя SelectedItems
, так как CommandParameter
всегда был null
), вот решение для приложений для универсальной платформы Windows (UWP). Он работает с использованием Microsoft.Xaml.Interactivity
и Microsoft.Xaml.Interactions.Core
.
Вот Вид:
<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>
Вот ViewModel (RelayCommand
класс от 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;
}
}
Учтите, что если вы собираетесь удалить элементы из оригинальной коллекции после (пользователь нажимает кнопку и т. д.), он также удалит элементы из вашего списка _selectedItems
! Если вы сделаете это в цикле foreach, вы получите InvalidOperationException
. Чтобы избежать этого, просто добавьте охранник в обозначенном месте, как:
if (_deletingItems)
return;
, а затем в способе, в котором вы, например, удалить элементы, выполните следующие действия:
_deletingItems = true;
foreach (var item in _selectedItems)
YourOriginalCollection.Remove(item);
_deletingItems = false;
'SelectedItems' (множественное число) не поддерживает привязку данных. См. [Эта ссылка] (http://stackoverflow.com/questions/803216/managing-multiple-selections-with-mvvm) и [эта ссылка] (http://social.msdn.microsoft.com/forums/en- США/МОФ/резьба/edd335ea-e5e1-48e1-91a2-793d613f5cc3 /). Он также не работает как «CommandParameter», я всегда получаю «null», в то время как использование «SelectedItem» (единственного числа) отлично. –
@ user986080 Я не понимал, что 'SelectedItems' не поддерживает привязку. Я удалил это из ответа. Однако 'CommandParameter' работает, я его протестировал и смог выбрать список выбранных элементов. – evanb
В моем примере XAML отображается «ListBox», но я также проверил «ListView» и смог получить выбранные элементы из параметра команды. – evanb