2016-07-27 13 views
0

Ich habe versucht, einige Lösungen in SO gegeben, aber ich kann immer noch nicht den Befehl auslösen.WPF-Kontextmenü Befehl Binding

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> 

Ansichtsmodell:

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

public void EditImage() 
{ 

} 
+0

Die Bindung über 'Tag' und die Einstellung' DataContext' wird falsch gefüllt (speziell für 'MVVM'). Überprüfen Sie Binding-Fehler im Ausgabefenster. Es sollte ausreichen, um den Pfad nur in der Command-Bindung normal zu setzen. – Sinatr

Antwort

1

Haben meine XAML geändert,

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

feine Arbeiten. Dank

+0

Mussten Sie Ihren Befehl öffentlich machen? nur neugierig – Mafii

+0

Ja, natürlich funktionierte es nur, nachdem der Befehl zusammen mit den XAML-Änderungen an die Öffentlichkeit geändert wurde. Danke, dass du an der richtigen Stelle geholfen hast. – iamCR

2

Wechsel:

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

public void EditImage() 
{ 

} 

zu

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

public void EditImage() 
{ 

} 

Befehle müssen öffentlich zugänglich sein (oder aus Gründen der Korrektheit intern).

Auch, ändern Sie Ihre 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

Habe geändert, aber immer noch nicht. – iamCR

+0

Überprüfen Sie meine Bearbeitung. Ist Ihr DataContext des Fensters, in dem Sie sich befinden, in dem von Ihnen geposteten Viewmodel? Warum verwenden Sie das Relative-Source-Self? – Mafii

1

Eine weitere nette Abhilfe ist, eine statische Instanz des View-Modells in App.xaml zu erklären: <ViewModelTypeName x:Key="ViewModelName" d:IsDataSource="True" /> und bindet wie dies Command="{Binding Source={StaticResource ViewModelName}, Path=MyCommand}" ich hatte das gleiche Problem, wenn ich von Fenstern zu binden benötigt und menuitem native Datacontext gleichzeitig. Auch diese Lösung sieht nicht so kompliziert aus.