2012-12-31 1 views
8

MVVM wird verwendet. Ich habe ein separates Menü 'Letzte Dateien' erstellt, das seine Objekte von der Bindung bezieht. Es sieht wie folgt aus:WPF: Fügen Sie einen Befehl hinzu, der automatisch generiert wird, indem Sie die Menüelemente für das Binden binden

enter image description here

 <MenuItem Header="_Recent files" ItemsSource="{Binding RecentFiles, Converter={StaticResource RecentFilesToListOfStringsConverter}, Mode=OneWay}" > 
     </MenuItem> 

Jetzt würde ich Befehl an jeden der diese automatisch generierten Elemente hinzufügen möchten, die den Pfad als Befehlsparameter erhalten sollten und Importdatei Aktion durch Klick ausführen .

Könnten Sie bitte vorschlagen, wie es in MVVM Art und Weise getan werden kann?

Antwort

19

Wieder, fand die Lösung von mir. Ich habe versucht, den Befehl in der falschen Art und Weise, wie unten zu setzen, und es funktioniert nicht:

  <MenuItem Header="_Recent files" ItemsSource="{Binding RecentFiles, Converter={StaticResource RecentFilesToListOfStringsConverter}, Mode=OneWay}" > 
      <MenuItem.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}"> 
        <Setter Property="Command" Value="{Binding ImportRecentItemCommand}" /> 
       </Style> 
      </MenuItem.ItemContainerStyle> 
     </MenuItem> 

Hier ist der richtige Ansatz. Immer noch nicht verstehen, wie es funktioniert, muss WPF tief lernen!

  <MenuItem Header="_Recent files" ItemsSource="{Binding RecentFiles, Converter={StaticResource RecentFilesToListOfStringsConverter}, Mode=OneWay}" > 
      <MenuItem.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}"> 
        <Setter Property="Command" Value="{Binding DataContext.ImportRecentItemCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type MenuItem}, AncestorLevel=1}}" /> 
       </Style> 
      </MenuItem.ItemContainerStyle> 
     </MenuItem> 

EDIT: Die finale Version

XAML:

  <MenuItem Header="_Recent files" ItemsSource="{Binding RecentFiles, Converter={StaticResource RecentFilesToListOfStringsConverter}, Mode=OneWay}" > 
      <MenuItem.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}"> 
        <Setter Property="Command" Value="{Binding DataContext.ImportRecentItemCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type MenuItem}, AncestorLevel=1}}" /> 
        <Setter Property="CommandParameter" Value="{Binding}" /> 
       </Style> 
      </MenuItem.ItemContainerStyle> 
     </MenuItem> 

Ansichtsmodell: MVVM Light Toolkit verwendet wird, RelayCommand geht von dort:

 private ICommand _importRecentItemCommand; 

     public ICommand ImportRecentItemCommand 
     { 
      get { return _importRecentItemCommand ?? (_importRecentItemCommand = new RelayCommand<object>(ImportRecentItemCommandExecuted)); } 
     } 

     private void ImportRecentItemCommandExecuted(object parameter) 
     { 
      MessageBox.Show(parameter.ToString()); 
     } 

Genießen