So my other buttons that are all rigged in a identical way, within the same view and viewmodel, work fine.
This one however, which happens to be inside a context menu, doesn't. There aren't any binding expression errors either even when I change the command binding to something I know doesn't exist, which I find super interesting
The XAML
  <ListView SelectionMode="Single" ItemsSource="{Binding Path=DisplayImages}" >
        <ListView.Resources>
           <Style TargetType="ListViewItem">
               <Setter Property="ContextFlyout">
                    <Setter.Value>
                         <MenuFlyout>
                            <MenuFlyoutItem Text="Save Image" Icon="Save" Command="{Binding Path=SaveImageCommand}"/>
                         </MenuFlyout>
                    </Setter.Value>
               </Setter>
            </Style>
  </ListView.Resources>
The C#
public ICommand SaveImageCommand { get; set; }
SaveImageCommand = new CommandHandler(SaveImageExecuted, true);
private async void SaveImageExecuted()
{
}
My command handler
public class CommandHandler : ICommand
{
    private Action _action;
    private bool _canExecute;
    public CommandHandler(Action action, bool canExecute)
    {
        _action = action;
        _canExecute = canExecute;
    }
    public bool CanExecute(object parameter)
    {
        return _canExecute;
    }
    public event EventHandler CanExecuteChanged;
    public void Execute(object parameter)
    {
        _action();
    }
}
So I'm PRETTY sure this is a bug in the framework.
To work around it I decided to just use a click handler to invoke the executed command in the viewmodel. Super janky but it works.
XAML
    <MenuFlyoutItem Text="Save Image" Icon="Save" Click="OnSaveContextMenuClicked"/>
Behind Code
    private void OnSaveContextMenuClicked(object sender, RoutedEventArgs e)
    {
        viewModel.SaveImageCommand.Execute(sender);            
    }
I've found another workaround for this too. If you set the MenuFlyoutItem Command property using x:Bind instead of Binding, this will work, so long as the MenuFlyout has an x:Name.
<MenuFlyout x:Name="MyMenuFlyout">
    <MenuFlyoutItem Text="Save Image" Icon="Save" Command="{x:Bind SaveImageCommand}"/>
</MenuFlyout>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With