How to access a control from a ContextMenu menuitem via the visual tree?

This is happening because DataContext="{Binding PlacementTarget,... binding would set the button as MenuItems DataContext but that won’t add the ContextMenu to the VisualTree of your window and that’s why ElementName binding’s won’t work. A simple workaround to use ElementName bindings is to add this in your Window/UserControl’s code-behind:

NameScope.SetNameScope(contextMenuName, NameScope.GetNameScope(this)); 

Another solution is to do this –

<ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">   
    <MenuItem Command="{Binding DataContext.DoAction}"/>   
</ContextMenu>

DataContext="{Binding PlacementTarget,... will set the Button(Placementtarget) as the DataContext of your ContextMenu, so you can use Button’s DataContext to bind command.

Update:

You can try and use the NameScope.NameScope Attached Property to set NameScope in XAML but I am not sure how you will get the NameScope of parent window without code!

You will have to do something similar to following article by Josh Smith, he provides a way to do this in XAML; but that too involves code (more then that single line of code) –

Enable ElementName Bindings with ElementSpy

Any specific reason to not use this single line of code?

Leave a Comment