1

MVVM Light を使用して動作する CommandParameter で動作する RelayCommand を取得しようとしています。コマンドはビューモデルで定義されており、選択した ListBox アイテムをパラメーターとして渡したいと考えています。コマンドはバインドされていますが、パラメーターはバインドされていません。これは可能ですか?

<UserControl x:Class="Nuggets.Metro.Views.EmployeeListView"
         ...
         DataContext="{Binding EmployeeList,Source={StaticResource Locator}}">
   <ListBox x:Name="lstEmployee" ItemsSource="{Binding EmployeeItems}" Style="{StaticResource EmployeeList}" Tag="{Binding EmployeeItems}">
        <ListBox.ContextMenu>
            <ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                <MenuItem Header="Edit item" Command="{Binding EditEmployeeCommand}" CommandParameter="{Binding PlacementTarget.SelectedItem,RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"/>
                <MenuItem Header="Delete item" Command="{Binding DeleteEmployeeCommand}" CommandParameter="{Binding PlacementTarget.SelectedItem,RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"/>
            </ContextMenu>
        </ListBox.ContextMenu>
4

2 に答える 2

0

これはうまくいくはずです

<ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
  <MenuItem Header="Edit item" 
            Command="{Binding EditEmployeeCommand}" 
            CommandParameter="{Binding SelectedItem,ElementName=lstEmployee}"/>
  <MenuItem Header="Delete item" 
            Command="{Binding DeleteEmployeeCommand}"
            CommandParameter="{Binding SelectedItem,ElementName=lstEmployee}"/>
 </ContextMenu>

CommandParameter のバインディングで ListBox als ElementName の名前を使用し、パスを SelectedItem に設定します。

アップデート:

上記のコードは、ListBox と ContextMenu では機能しません。これらは異なるビジュアル ツリーに属しているためです。結果は

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=lstEmployee'. BindingExpression:Path=SelectedItem; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'CommandParameter' (type 'Object')

次の XAML がその役割を果たします。ContextMenu の PlacementTarget (ListBox) を使用します。

<ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
  <MenuItem Header="Edit item" 
            Command="{Binding EditEmployeeCommand}" 
            CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}"/>
  <MenuItem Header="Delete item" 
            Command="{Binding DeleteEmployeeCommand}"
            CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}"/>
</ContextMenu>
于 2013-04-24T07:55:07.910 に答える
0

これは、MVVM を使用した TreeView または ListView で機能します。ContextMenu の PlacementTarget は (ここでは) リストビューです

<ListView.ContextMenu>
  <ContextMenu>
     <MenuItem x:Name="OpenExplorer"Header="ShowFolder"                  
      Command="{Binding ShowExplorer}"
      CommandParameter ="{Binding Path=PlacementTarget.SelectedItem,
            RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
   </ContextMenu>
</ListView.ContextMenu>
于 2015-07-16T04:04:59.650 に答える