由于没有其他答案帮助我(使用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>
这里的视图模型(RelayCommand
是MVVM光类):
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-美国/ WPF /线程/ edd335ea-e5e1-48e1-91a2-793d613f5cc3 /)。它不能作为'CommandParameter'工作,我总是得到'null',而使用'SelectedItem'(单数)是好的。 –
@ user986080我没有意识到'SelectedItems'不支持绑定。我从答案中删除了这个。然而'CommandParameter'确实可行,我已经测试过了,并且能够列出所选项目。 – evanb
我的XAML示例显示了一个'ListBox',但我也测试了一个'ListView',并且能够从命令参数中获取所选项目。 – evanb