WPF上下文菜单命令绑定

本文关键字:绑定 命令 菜单 上下文 WPF | 更新日期: 2023-09-27 17:58:46

我尝试了SO中给出的一些解决方案,但仍然无法触发命令。

XAML:

 <Image Source="{Binding CurrentImage.Source, Mode=OneWay}" Grid.Row="0" Grid.Column="1" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType= Window}}">
     <Image.ContextMenu>
            <ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                  <MenuItem Header="Edit Image" Command="{Binding PlacementTarget.Tag.EditImageCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"></MenuItem>
            </ContextMenu>
     </Image.ContextMenu>

ViewModel:

private ICommand _EditImageCommand;
public ICommand EditImageCommand
   {
      get
        {
           return _EditImageCommand ?? (_EditImageCommand = new CommandHandler(() => EditImage(), _canExecute));
        }
   }
 public void EditImage()
 {
 }

WPF上下文菜单命令绑定

更改:

private ICommand _EditImageCommand;
private ICommand EditImageCommand
   {
      get
        {
           return _EditImageCommand ?? (_EditImageCommand = new CommandHandler(() => EditImage(), _canExecute));
        }
   }
 public void EditImage()
 {
 }

private ICommand _EditImageCommand;
public ICommand EditImageCommand // has to be public
   {
      get
        {
           return _EditImageCommand ?? (_EditImageCommand = new CommandHandler(() => EditImage(), _canExecute));
        }
   }
 public void EditImage()
 {
 }

命令必须是公共的才能访问(或者为了正确起见是内部的)。

此外,将您的xaml更改为:

<Image Source="{Binding CurrentImage.Source, Mode=OneWay}" Grid.Row="0" Grid.Column="1" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType= Window}}">
     <Image.ContextMenu>
            <ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                  <MenuItem Header="Edit Image" Command="{Binding EditImageCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"></MenuItem>
            </ContextMenu>
     </Image.ContextMenu>

已将我的XAML更改为,

<Window.Resources>
        <local:ImageList x:Key="SliderViewModel"></local:ImageList>
</Window.Resources>
    <Image Source="{Binding CurrentImage.Source, Mode=OneWay}" Grid.Row="0" Grid.Column="1">
        <Image.ContextMenu>
               <ContextMenu>
                     <MenuItem Header="Edit Image" Command="{Binding EditImageCommand, Source={StaticResource SliderViewModel}}"></MenuItem>
                 </ContextMenu>
         </Image.ContextMenu>
     </Image>

工作良好。感谢

另一个很好的解决方法是在App.xaml:<ViewModelTypeName x:Key="ViewModelName" d:IsDataSource="True" />中声明视图模型的静态实例,并像这样绑定Command="{Binding Source={StaticResource ViewModelName}, Path=MyCommand}"。当我需要同时从Window和菜单项的本地DataContext绑定时,我遇到了同样的问题。此外,这个解决方案看起来并没有那么复杂。