Как правильно связать CommandParameter с моим ContextMenu для выбранного ListViewItem - PullRequest
0 голосов
/ 13 ноября 2018

Итак, у меня есть ListView, и когда я щелкаю правой кнопкой мыши по элементу, у меня появляется команда, которая срабатывает при нажатии.Я хочу иметь возможность получить текст, который находится внутри выбранного элемента.Итак, я думаю, что я хочу связать SelectedItem из ListView как CommandParameter

Я заметил, что ContextMenu не в визуальном дереве, что делает вещи немного более запутанными.

В настоящее время возвращается null

<ListView x:Name="PlayerListView"
                  Width="200"
                  Height="330"
                  VerticalAlignment="Top"
                  Margin="0,80,15,0"
                  HorizontalAlignment="Right"
                  Background="#252525"
                  VerticalContentAlignment="Center"
                  ItemsSource="{Binding ServerViewModel.Players}">


            <ListView.ItemTemplate>
                <DataTemplate DataType="{x:Type model:PlayerModel}">
                    <StackPanel Orientation="Horizontal" 
                                VerticalAlignment="Stretch" 
                                HorizontalAlignment="Stretch"
                                Width="190"
                                Background="#222222">

                        <StackPanel.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Command One"
                                          DataContext="{Binding DataContext, 
                                          Source={mvvm:RootObject}}" 
                                          Command="{Binding ServerViewModel.MyCommand}"
                                          CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu},
                                            Path=PlacementTarget.SelectedItem}">
                                    <MenuItem.Icon>
                                        <Image Source="../../Assets/image.png"
                                               RenderOptions.BitmapScalingMode="Fant"
/>
                                    </MenuItem.Icon>
                                </MenuItem>
                            </ContextMenu>
                        </StackPanel.ContextMenu>

                        <Image Source="../../Assets/image.png"
                               Width="20"
                               Height="20"/>

                        <TextBlock Text="{Binding Username}" 
                                   Foreground="White"
                                   HorizontalAlignment="Stretch"
                                   VerticalAlignment="Center" 
                                   Margin="5"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Команда работает нормально, все запускается, но возвращает ноль, и я знаю, что это потому, как настроен XAML, но я неконечно, как пройти через DOM

DataContext настроен следующим образом

public MainWindow()
{
    InitializeComponent();
    DataContext = new BaseViewModel();
}

RelayCommand

public class RelayCommand : ObservableObject, ICommand
    {
        private readonly Action<object> _execute;
        private readonly Predicate<object> _canExecute;

        public RelayCommand(Action<object> execute, Predicate<object> canExecute)
        {
            if (execute == null)
                throw new ArgumentException("execute");

            _execute = execute;
            _canExecute = canExecute;
        }

        public RelayCommand(Action<object> execute) : this(execute, null)
        {

        }

        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }

        public void Execute(object parameter)
        {
            //This is where I debug and see that it returns null
            _execute.Invoke(parameter);
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    }

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете связать с PlacementTarget (StackPanel) из ContextMenu и затем получить его DataContext:

<DataTemplate DataType="{x:Type model:PlayerModel}">
    <StackPanel Orientation="Horizontal" 
                VerticalAlignment="Stretch" 
                HorizontalAlignment="Stretch"
                Width="190"
                Background="#222222"
                Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ListView}}">
        <StackPanel.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Command One"
                        Command="{Binding PlacementTarget.Tag.ServerViewModel.MyCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                        CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu}}">
                    <MenuItem.Icon>
                        <Image Source="../../Assets/image.png" RenderOptions.BitmapScalingMode="Fant"/>
                    </MenuItem.Icon>
                </MenuItem>
            </ContextMenu>
        </StackPanel.ContextMenu>

        <Image Source="../../Assets/image.png" Width="20" Height="20"/>

        <TextBlock Text="{Binding Username}" 
                Foreground="White"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Center" 
                Margin="5"/>
    </StackPanel>
</DataTemplate>
...