因此,我试图将SelectedItem
作为参数传递,以便可以使用绑定到它的数据。
基本上,我想打开一个MessageBox
并显示绑定到该项目的User的Name
属性。
这是我的xaml
<ItemsControl ItemsSource="{Binding CardViewModel.Users}"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
dd:DragDrop.UseDefaultEffectDataTemplate="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<controls:UserCard>
<controls:UserCard.ContextMenu>
<!-- Bind the DataContext of the CM to the DataContext that's bound to the RootObject-->
<ContextMenu DataContext="{Binding DataContext, Source={local:RootObject}}">
<MenuItem Header="Edit"
Command="{Binding CardViewModel.EditUser}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}},
Path=PlacementTarget.SelectedItem}"/>
</ContextMenu>
</controls:UserCard.ContextMenu>
</controls:UserCard>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
该命令可以正常工作,除了单击MenuItem
并触发该命令后,所有内容都可以正常运行,我在操作处放置了一个断点,并将参数显示为null
怀疑是我自己将其绑定错误。
public void DisplayEditUser(object user)
{
if (user != null)
{
MessageBox.Show("Not null");
}
}
答案 0 :(得分:0)
问题在于ContextMenu.PlacementTarget
不是ItemsControl
而是UserCard
,因此绑定源解析绝对会失败。要解决此问题,您需要将ItemsControl.SelectedItem
绑定到UserCard
的一个属性(例如Tag
)作为中继。
<controls:UserCard Tag="{Binding SelectedItem, RelativeSource={RelativeSource AncestorType=ListBox}}">
CommandParameter="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"