Вот пример того, как я настраиваю ItemsControl для вызова команды и передачи элемента через параметр команды для выполнения некоторой работы с использованием MVVM Light.
<Window.Resources>
<h:BindingProxy x:Key="proxy" Data="{Binding}"></h:BindingProxy>
</Window.Resources>
<Grid>
<ItemsControl ItemsSource="{Binding MyData}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Remove Me" Command="{Binding Data.MyCommand, Source={StaticResource proxy}}" CommandParameter="{Binding}"></MenuItem>
</ContextMenu>
</Grid.ContextMenu>
<TextBlock Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding SomeField}"></TextBlock>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
Я использую BindingProxy для привязки текстового окна к контекстному меню для получения команды, вот код для этого.
/// <summary>
/// BindingProxy
/// Used to get Parent datacontext within Child control.
/// </summary>
public class BindingProxy : Freezable
{
#region " Overrides Of Freezable "
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
#endregion
#region " Data "
// Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
#endregion
}
Как видите, CommandParameter просто использует {Binding}, чтобы получить объект для строки ItemsSource, которая связана с ObservableCollection<SomeClass>.
Надеюсь, это даст вам некоторое представление о настройке контекстного меню для выполнения некоторой работы.