上下文菜单,用于删除listview中的项目

时间:2012-06-18 11:48:56

标签: wpf listview contextmenu

我有一个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);  

}

打开上下文菜单时,所选项目为空的任何想法?也许是listview的焦点问题?

3 个答案:

答案 0 :(得分:32)

H.B。是正确的。但您也可以使用RelativeSource Binding

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

答案 1 :(得分:3)

ContextMenus已断开连接,您无法使用ElementName绑定。一种解决方法是使用Binding.Sourcex: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>

答案 2 :(得分:0)

这项工作对我来说CommandParameter =&#34; {Binding}&#34;