2016-07-27 181 views
0

我已經嘗試了幾個在SO中給出的解決方案,但仍然無法觸發該命令。WPF上下文菜單命令綁定

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> 

視圖模型:

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

public void EditImage() 
{ 

} 
+0

通過'Tag'設置綁定並設置'DataContext'填充錯誤(特別是對於'MVVM')。檢查輸出窗口中的綁定錯誤。只需在'Command'綁定中正常設置路徑即可。 – Sinatr

回答

1

改變了我的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> 

做工精細。由於

+0

您是否需要將您的命令更改爲公開?只是好奇 – Mafii

+0

是的,只有在將命令與XAML更改一起更改爲公共後,才能正常工作。謝謝你在正確的位置提供幫助。 – iamCR

2

變化:

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> 
+0

已經改變,但仍然沒有改變。 – iamCR

+0

檢查我的編輯。您在發佈的視圖模型中的窗口是否是您的DataContext?你爲什麼使用相對來源自我? – Mafii

1

另外一個不錯的解決方法是申報您的視圖模型的靜態實例中的App.xaml:<ViewModelTypeName x:Key="ViewModelName" d:IsDataSource="True" />並綁定這樣Command="{Binding Source={StaticResource ViewModelName}, Path=MyCommand}"我有同樣的問題,當我需要從窗口結合和菜單項同時是原生的DataContext。而且這個解決方案看起來並不複雜。