Почему мой CommandParameter имеет значение NULL, когда у меня указан путь в качестве SelectedItem? - PullRequest
0 голосов
/ 24 января 2019

Поэтому я пытаюсь передать SelectedItem в качестве параметра, чтобы я мог использовать данные, которые к нему привязаны.

По сути, я хочу открыть MessageBox и отобразить свойство 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 голосов
/ 25 января 2019

Проблема в том, что 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}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...