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?