文字列値のリストを表示するListViewがあります。リスト内の各アイテムにコンテキストメニューエントリを追加して、選択したアイテムを削除したいと思います。私のXAMLは次のようになります。
<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="Remove"
Command="{Binding RemoveItem}"
CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}" />
</ContextMenu>
</ListView.ContextMenu>
</ListView>
問題は、CommandParameter
値が常にnullであるということです。コマンドが機能するかどうかを確認するために、選択したアイテムを削除するボタンを追加しました。ボタンにはまったく同じバインディングがあり、ボタンを介したアイテムの削除は機能します。ボタンは次のようになります。
<Button Content="Remove selected item"
Command="{Binding RemoveItem}"
CommandParameter="{Binding ElementName=itemsListView, Path=SelectedItem}"/>
コマンドは次のようになります。
private ICommand _removeItem;
public ICommand RemoveItem
{
get { return _removeItem ?? (_removeItem = new RelayCommand(p => RemoveItemCommand((string)p))); }
}
private void RemoveItemCommand(string item)
{
if(!string.IsNullOrEmpty(item))
MyItems.Remove(item);
}
コンテキストメニューを開いたときに選択した項目がnullになる理由はありますか?たぶんリストビューの焦点の問題?
H.B.は正しい。ただし、RelativeSourceBindingを使用することもできます
<ListView x:Name="itemsListView" ItemsSource="{Binding MyItems}">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="Remove"
Command="{Binding RemoveItem}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem}" />
</ContextMenu>
</ListView.ContextMenu>
</ListView>
ContextMenus
は切断されています。ElementName
バインディングは使用できません。回避策の1つは、Binding.Source
および x:Reference
を使用することです。これにより、リソース内にあるためにそれを使用するパーツを抽出する必要があります(周期的な依存関係エラーのため)。コンテキストメニュー全体をそこに置くことができます。
例:
<ListBox Name="lb" Height="200">
<ListBox.Resources>
<ContextMenu x:Key="cm">
<MenuItem Header="{Binding ActualHeight, Source={x:Reference lb}}" />
</ContextMenu>
</ListBox.Resources>
<ListBox.ContextMenu>
<StaticResource ResourceKey="cm" />
</ListBox.ContextMenu>
</ListBox>
これは私にとってはうまくいきますCommandParameter = "{Binding}"