Dynamic ContextMenu In CodeBehind
The following code works for me, InsertQuery/DeleteQuery are two ICommand methods defined in ViewModel.
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="Insert"
Command="{Binding DataContext.InsertQuery, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
<MenuItem Header="Delete"
Command="{Binding DataContext.DeleteQuery, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
</ContextMenu>
</DataGrid.ContextMenu>
Additionaly you can put commands on the menuItem...
Like this:
<MenuItem Header="MyContextMenuItem
Command="{Binding Path=MyCommand}"
CommandTarget="{Binding
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}}">
CommandTarget can be very important, if you use your contextMenu on different controls. I often use the FindAncestor here, to identify the caller.
You can define your ContextMenu
in resources and bind it to any control you needed. Check this out:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<ContextMenu x:Key="MyContextMenu">
<MenuItem Header="Send" />
</ContextMenu>
</Window.Resources>
<Grid>
<Button Name="a_button"
ContextMenu="{StaticResource MyContextMenu}" >
</Button>
</Grid>
</Window>