2012-12-31 77 views
8

使用MVVM。我創建了單獨的菜單「最近的文件」,它從綁定中獲取它的項目。它看起來像:WPF:添加命令以自動生成綁定菜單項

enter image description here

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

現在,我想命令添加到每個這些自動生成的項目,這應該得到的路徑作爲命令參數,並通過點擊執行導入文件操作。

您能否建議如何在MVVM方式下完成?

回答

19

再次,我自己找到了解決方案。我試圖以下面的錯誤的方式把命令,它不起作用:

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

這是正確的做法。仍然不明白它是如何工作的,必須深入學習WPF!

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

編輯:最終版本

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> 

視圖模型:MVVM光工具包使用,RelayCommand去從那裏:

 private ICommand _importRecentItemCommand; 

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

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

享受