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>