web-dev-qa-db-ja.com

リストビューのアイテムを削除するためのコンテキストメニュー

文字列値のリストを表示する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になる理由はありますか?たぶんリストビューの焦点の問題?

13
M.E.

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

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>
3
H.B.

これは私にとってはうまくいきますCommandParameter = "{Binding}"

0
Vivek Malik