他の回答はどれも役に立たなかったので (いつものSelectedItems
ように使用)、ユニバーサル Windows プラットフォーム (UWP) アプリのソリューションを次に示します。と を使用して動作します。CommandParameter
null
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;