项目场景:
使用MVVM架构,ListBox中使用右键菜单绑定命令并传值
问题描述
<ContextMenu>
<MenuItem Header="删除" Style="{StaticResource MenuItemStyle}" Command="{Binding DeleteCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox},Path=SelectedItem}" />
</ContextMenu>
发现无论是通过ElementName还是RelativeSource中的FindAncestor传值,命令接收到的参数一直都是null。
原因分析:
ContextMenu是它自身视觉树的根节点,所以通过RelativeSource.FindAncestor就找不到ListBox。另:ContextMenu有其自身的视觉树并且它不是ListBox视觉树的一部分。
解决方案:
<ContextMenu>
<MenuItem Header="删除" Style="{StaticResource MenuItemStyle}" Command="{Binding DeleteCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu},Path=PlacementTarget.SelectedItem}" />
</ContextMenu>