Вот еще один обходной путь только для xaml. (Это также предполагает, что вы хотите, что находится внутри DataContext , например, вы MVVMing it)
Первый вариант, когда родительский элемент ContextMenu отсутствует в DataTemplate :
Command="{Binding PlacementTarget.DataContext.MyCommand,
RelativeSource={RelativeSource AncestorType=ContextMenu}}"
Это сработает для вопроса ОП. Это не будет работать, если вы находитесь внутри DataTemplate . В этих случаях DataContext часто является одним из многих в коллекции, а ICommand , к которому вы хотите привязать, является родственным свойством коллекции в рамках той же модели представления ( DataContext окна, скажем).
В этих случаях вы можете воспользоваться тегом для временного хранения родительского DataContext , который содержит как коллекцию, так и вашу ICommand:
class ViewModel
{
public ObservableCollection<Derp> Derps { get;set;}
public ICommand DeleteDerp {get; set;}
}
и в xaml
<!-- ItemsSource binds to Derps in the DataContext -->
<StackPanel
Tag="{Binding DataContext, ElementName=root}">
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem
Header="Derp"
Command="{Binding PlacementTarget.Tag.DeleteDerp,
RelativeSource={RelativeSource
AncestorType=ContextMenu}}"
CommandParameter="{Binding PlacementTarget.DataContext,
RelativeSource={RelativeSource AncestorType=ContextMenu}}">
</MenuItem>