我有一个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的焦点问题?
答案 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.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>
答案 2 :(得分:0)
这项工作对我来说CommandParameter =&#34; {Binding}&#34;