由於沒有其他答案幫助我(使用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