In WPF, I have this Button
(with a ContextMenu
) that has a MyString
string property defined in the code behind. I'm trying to send this string as the CommandParameter
of a DelegateCommand
called when one of the MenuItem
of the ContextMenu
is called.
The DelegateCommand
call in the ViewModel works, but the CommandParameter
is not being passed along it.
I've tried different approaches for the MenuItem
code, such as 1) defining a name for the Button in order to use the ElementName
attribute, as well as 2) trying to get it by finding string property by the ancestor type, but neither worked. I get the parameter as null
instead in the ViewModel.
Approach 1:
<Button x:Name=MyButtonName"
<some code supressed...>
<Button.ContextMenu>
<ContextMenu>
<MenuItem x:Name="SomeMenuAction">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Click">
<b:InvokeCommandAction
Command="{Binding Path=MyDelegateCommand}"
CommandParameter="{Binding Name, ElementName=MyButtonName}"/>
</b:EventTrigger>
</b:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Button.ContextMenu>
</Button>
Approach 2:
CommandParameter="{Binding Name, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:WorkspaceButton}}}"
This is the code behind it:
public partial class WorkspaceButton : Button
{
public string Name { get; set; }
public WorkspaceButton(string name)
{
InitializeComponent();
if (name == String.Empty) return;
Name = name;
}
}
In the ViewModel I have the following code:
DelegateCommand<object> _myDelegateCommand;
public DelegateCommand<object> MyDelegateCommand => _myDelegateCommand
= new DelegateCommand<object>(ExecuteMyDelegateCommand);
void ExecuteMyDelegateCommand(object parameter)
{
// do something with the string parameter received
}
For some reason, if I type a string like "This is a test", it works...
<MenuItem x:Name="PinOrUnpinAction">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Click">
<b:InvokeCommandAction
Command="{Binding Path=MyDelegateCommand}"
CommandParameter="This is a test" />
</b:EventTrigger>
</b:Interaction.Triggers>
</MenuItem>
I'd appreciate if anyone could help out.