I try to do something like this:
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding RemoveRow}"
CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>
but I got null always (I tried also SelectedIndex and SelectedValue)
if I pass the following parameter to the execution code, it works:
<MenuItem Command="{Binding RemoveRow}" CommandParameter="1">
Try something like this in your CommandParameter,
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="MyHeader"
Command="{Binding MyCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem}" />
</DataGrid.ContextMenu>
I already tested it and it should work.
It doesn't work because the ContextMenu is not part of the visual or logical tree of the DataGrid, so it doesn't inherit the DataContext.
As far as I know, there is know easy solution to this problem using only the built-in binding system. However, using a simple "proxy" class as explained here, you can work around this problem:
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}">
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding Data.RemoveRow, Source={StaticResource proxy}}"
CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>
However you still have a problem: ElementName=myGrid doesn't work (again, because ContextMenu isn't in the visual or logical tree of the DataGrid, so it's not in the same name scope). A simple solution is to bind the SelectedItem of the DataGrid to a property of the ViewModel, and use that property instead of the command parameter:
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}"
SelectedItem="{Binding SelectedItem}">
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding Data.RemoveRow, Source={StaticResource proxy}}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>
来源:https://stackoverflow.com/questions/8154202/pass-command-parameter-from-the-xaml