MVVM, ContextMenus and binding to ViewModel defined Command
- by Simon Fox
Hi
I am having problems with the binding of a ContextMenu command to an ICommand property in my ViewModel. The binding seems to be attaching fine...i.e when I inspect the value of the ICommand property it is bound to an instance of RelayCommand. The CanExecute delegate does get invoked, however when I open the context menu and select an item the Execute delegate does not get invoked.
Heres my View (which is defined as the DataTemplate to use for instances of the following ViewModel in a resource dictionary):
<UserControl x:Class="SmartSystems.DragDropProto.ProductLinkView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Proto">
<UserControl.Resources>
<local:CenteringConverter x:Key="centeringConvertor">
</local:CenteringConverter>
</UserControl.Resources>
<UserControl.ContextMenu>
<ContextMenu>
<MenuItem Command="{Binding ChangeColor}">Change Color</MenuItem>
</ContextMenu>
</UserControl.ContextMenu>
<Canvas>
<Ellipse Width="5" Height="5" >
<Ellipse.Fill>
<SolidColorBrush Color="{Binding LinkColor}"></SolidColorBrush>
</Ellipse.Fill>
<Ellipse.RenderTransform>
<TranslateTransform X="{Binding EndpointOneXPos,
Converter={StaticResource centeringConvertor}}"
Y="{Binding EndpointOneYPos,
Converter={StaticResource centeringConvertor}}"/>
</Ellipse.RenderTransform>
</Ellipse>
<Line X1="{Binding Path=EndpointOneXPos}" Y1="{Binding Path=EndpointOneYPos}"
X2="{Binding Path=EndpointTwoXPos}" Y2="{Binding Path=EndpointTwoYPos}">
<Line.Stroke>
<SolidColorBrush Color="{Binding LinkColor}"></SolidColorBrush>
</Line.Stroke>
</Line>
<Ellipse Width="5" Height="5" >
<Ellipse.Fill>
<SolidColorBrush Color="{Binding LinkColor}"></SolidColorBrush>
</Ellipse.Fill>
<Ellipse.RenderTransform>
<TranslateTransform X="{Binding EndpointTwoXPos,
Converter={StaticResource centeringConvertor}}"
Y="{Binding EndpointTwoYPos,
Converter={StaticResource centeringConvertor}}"/>
</Ellipse.RenderTransform>
</Ellipse>
</Canvas>
</UserControl>
and ViewModel (with uneccessary implementation details removed):
class ProductLinkViewModel : BaseViewModel
{
public ICommand ChangeColor
{
get;
private set;
}
public Color LinkColor
{
get;
private set;
}
public ProductLinkViewModel(....)
{
...
ChangeColor = new RelayCommand(ChangeColorAction);
LinkColor = Colors.Blue;
}
private void ChangeColorAction(object param)
{
LinkColor = LinkColor == Colors.Blue ? Colors.Red : Colors.Blue;
OnPropertyChanged("LinkColor");
}
}