Во-первых, я бы обработал команду во ViewModel. Я предполагаю, что список, который используется для привязки, находится в ViewModel, поэтому любой код, который «работает» в этом списке, должен также выполняться в ViewModel.
class MyViewModel
{
// ... Clipping rest of ViewModel class ...
private ObservableCollection<MyObject> mMyList = new ObservableCollection<MyObject>();
private ICommand mMyDeleteCommand;
public MyViewModel()
{
InitializeMyListSomehow();
mMyDeleteCommand = new MyCommandClass(
(item) => DeleteItem(item),
() => mDeleteCanExecute
);
}
public ObservableCollection<MyObject> MyList
{
get { return mMyList; }
set
{
// Some function that updates the value and implements INPC
SetProperty("MyList", ref mMyList, value);
}
}
public ICommand MyDeleteCommand
{
get { return mMyDeleteCommand; }
}
void DeleteHandler(var item)
{
int index = mMyList.Remove(item);
}
}
Уникальны ли предметы? Если это так, вы можете передать элемент, а обработчик команды Delete может найти этот элемент в списке.
Если предметы не уникальны, вам придется немного поработать над логикой, в зависимости от ожидаемого результата.
Теперь в представлении ваш код будет выглядеть (обратите внимание, что StaticResource становится привязкой):
<ItemsControl ItemsSource="{Binding MyList}">
<ItemsControl.ItemTemplate>
...
<Button Command="{Binding DataContext.MyDeleteCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ItemsControl}}}"
CommandParameter="{Binding}">
Remove item
</Button>
...
</ItemsControl.ItemTemplate>
</ItemsControl>