关于WPF中menuitem在绑定命令时,无法将控件作为命令参数传递的问题(MenuItem.CommandParameter Object 找不到源)

问题描述:在 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。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值