tags:

views:

405

answers:

1

I need to create a ContextMenu where I want to pass a currently selected index of the datagrid to a ViewModel using CommandParameter. The following Xaml code doesn't work. What might be the problem?

<dg:DataGrid ItemsSource="{Binding MarketsRows}"
    <dg:DataGrid.ContextMenu >
        <ContextMenu >
            <MenuItem Header="Add Divider"
                  CommandParameter="{Binding Path=SelectedIndex,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type dg:DataGrid}}}"
                  Command="{Binding Path= AddDividerCommand}"/>
        </ContextMenu>
    </dg:DataGrid.ContextMenu>
</dg:DataGrid>
+1  A: 

A context menu is not part of the same visual tree. Ancestor bindings dont work as the context menu is not a child of the element it is on; in your case the datagrid.

There are some workarounds, Ive answered this question previously here and here (kind of)

But what you are looking for is the placement target to do something like this (as long as AddDividerCommand is a property on the datagrid(i.e. the placement target)

<ContextMenu DataContext="{Binding RelativeSource={RelativeSource Mode=Self}, Path=PlacementTarget}">
 <MenuItem
    Header="Add Divider"
    CommandParameter="{Binding Path=SelectedIndex}"
    Command="{Binding Path=AddDividerCommand}"/>
</ContextMenu>
Aran Mulholland
It works!!! Thanks! I only had to slightly modify DataContext:DataContext="{Binding RelativeSource={RelativeSource Mode=Self}, Path=PlacementTarget.DataContext}"
Boris Lipschitz