J'ai une liste d'éléments dans une ListBox WPF. Je veux permettre à l'utilisateur de sélectionner plusieurs de ces éléments et de cliquer sur un bouton Supprimer pour éliminer ces éléments de la liste.
En utilisant le modèle MVVM RelayCommand, j'ai créé une commande avec la signature suivante :
public RelayCommand<IList> RemoveTagsCommand { get; private set; }
Dans ma vue, j'ai câblé ma commande RemoveTagsCommand de la façon suivante :
<DockPanel>
<Button DockPanel.Dock="Right" Command="{Binding RemoveTagsCommand}" CommandParameter="{Binding ElementName=TagList, Path=SelectedItems}">Remove tags</Button>
<ListBox x:Name="TagList" ItemsSource="{Binding Tags}" SelectionMode="Extended">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.Resources>
<DataTemplate DataType="{x:Type Model:Tag}">
...
</DataTemplate>
</ListBox.Resources>
</ListBox>
</DockPanel>
Le constructeur de mon ViewModel crée une instance de la commande :
RemoveTagsCommand = new RelayCommand<IList>(RemoveTags, CanRemoveTags);
Mon implémentation actuelle de RemoveTags est maladroite, avec des castings et des copies. Existe-t-il une meilleure façon de l'implémenter ?
public void RemoveTags(IList toRemove)
{
var collection = toRemove.Cast<Tag>();
List<Tag> copy = new List<Tag>(collection);
foreach (Tag tag in copy)
{
Tags.Remove(tag);
}
}