Я решил это, используя встроенную функциональность WPF DataGrid. Сетка обрабатывает удаление элементов по умолчанию, если базовая коллекция является редактируемой (если коллекция предназначена для этой цели, это не проблема, в противном случае можно добавить промежуточную коллекцию ...). Я избежал каких-либо привязок клавиш и просто настроил сетку так:
<DataGrid ItemsSource="{Binding InvoiceItems}" IsReadOnly="False" CanUserDeleteRows="True" CanUserAddRows="False">
Коллекция ItemsSource имеет тип BidningCollection <>
В моем ViewModel (мой DataContext) я добавляю обработчик для события CollectionChanged:
InvoiceItems.CollectionChanged += InvoiceItemsCollectionChanged;
И реализовать это так:
private void InvoiceItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action != NotifyCollectionChangedAction.Remove)
return;
foreach (var oldItem in e.OldItems)
{
//do any other processing necessary
}
}
Это потому, что у вас, вероятно, будет по крайней мере два способа удаления элемента из вашей базовой коллекции (клавиатура с клавишей Del, некоторая кнопка) и, возможно, некоторые другие вещи, о которых нужно позаботиться при удалении элемента.