问题描述:在 WPF 中,使用MenuItem绑定命令,希望将其所属控件listview作为参数传递到Viewmodel中,出现错误:MenuItem.CommandParameter Object 找不到源: ElementName=ListView。 代码如下
<ListView Name="ListView" >
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="删除" Command="{Binding DeleteFileCommand}" CommandParameter="{Binding ElementName=ListView}"/>
<MenuItem Header="重命名" Command="{Binding ReNameFileCommand}"/>
</ContextMenu>
</ListView.ContextMenu>
</ListView>
原因
错误通常是因为数据上下文 (DataContext) 的问题。具体来说,ContextMenu 不是视觉树的一部分,它没有继承 ListView 的数据上下文,因此不能正确解析 ElementName 绑定。
解决办法:使用 PlacementTarget 解决上下文问题
ContextMenu 的 PlacementTarget 属性指向打开它的元素。通过绑定到 PlacementTarget,可以获取 ListView 作为 CommandParameter。
<ListView Name="ListView" >
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="删除" Command="{Binding DeleteFileCommand}"
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
<MenuItem Header="重命名" Command="{Binding ReNameFileCommand}"/>
</ContextMenu>
</ListView.ContextMenu>
</ListView>
在这里,PlacementTarget 是打开 ContextMenu 的 ListView,通过 RelativeSource 绑定到 ContextMenu,再从 PlacementTarget 获取 ListView 作为 CommandParameter。