当路径为SelectedItem时,为什么CommandParameter为null?

时间:2019-01-24 17:51:36

标签: c# .net wpf mvvm data-binding

因此,我试图将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");
    }
}

1 个答案:

答案 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}}"