Mvvm 如何在contextmenu的CommandParameter中传递Treeview项的selectedItem

Mvvm 如何在contextmenu的CommandParameter中传递Treeview项的selectedItem,mvvm,treeview,Mvvm,Treeview,我有下面的xaml到树视图控件和上下文菜单“编辑”。当我选择编辑上下文菜单时,我的EditCommand方法在MVVM中执行 问题: 我得到的参数是“TreeView”。我想将参数作为所选项目获取(使用位置) 有人能告诉我在CommandParameter中更改什么以获得所选项目吗 我已经尝试了下面的链接,但提供的解决方案对我不起作用。 [ [只需将SelectedItem添加到PlacementTarget中,如下所示: <TreeView x:Name="treeView" Ite

我有下面的xaml到树视图控件和上下文菜单“编辑”。当我选择编辑上下文菜单时,我的EditCommand方法在MVVM中执行

问题:

我得到的参数是“TreeView”。我想将参数作为所选项目获取(使用位置)


有人能告诉我在CommandParameter中更改什么以获得所选项目吗

我已经尝试了下面的链接,但提供的解决方案对我不起作用。 [
[

只需将
SelectedItem
添加到
PlacementTarget
中,如下所示:

<TreeView x:Name="treeView" ItemsSource="{Binding TreeViewItems}">
   <TreeView.ContextMenu>
      <ContextMenu>
          <MenuItem Header="Edit" Command="{Binding EditCommand}" 
              CommandParameter="{Binding PlacementTarget.SelectedItem, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}}}"/>
      </ContextMenu>
   </TreeView.ContextMenu>
</TreeView>
代码隐藏:

using System.Collections.Generic;
using System.Windows;
using System.Linq;
using System;
using System.Collections.ObjectModel;
using System.Windows.Input;
using WpfApplication1;

namespace WPF_Sandbox
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public ObservableCollection<string> Data { get; set; }  = new ObservableCollection<string>();
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            Data.Add("A");
            Data.Add("B");
            Data.Add("C");
        }

        public ICommand EditCommand
        {
            get
            {
                return new Command<object>(Edit);
            }
        }

        private void Edit(object param)
        {
            //Your code here
        }
    }    
}
使用System.Collections.Generic;
使用System.Windows;
使用System.Linq;
使用制度;
使用System.Collections.ObjectModel;
使用System.Windows.Input;
使用WpfApplication1;
名称空间WPF_沙盒
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共ObservableCollection数据{get;set;}=new ObservableCollection();
公共主窗口()
{
初始化组件();
DataContext=this;
数据。添加(“A”);
数据。添加(“B”);
数据。添加(“C”);
}
公共ICommand edit命令
{
得到
{
返回新命令(编辑);
}
}
私有无效编辑(对象参数)
{
//你的代码在这里
}
}    
}

这对我来说很有用。

不走运。我仍然在EditCommand中获得空值。请您验证一下,我是否遗漏了什么。@dhiraj sakariya-愚蠢的问题,您是否确保先左键单击一个项目以选择它,然后右键单击?如果您没有,那么这将解释为什么会获得空参数。如果您是,那么我会需要查看您的
ICommand
实现。我已更新了我的答案,以显示我的命令实现以及我的代码隐藏。注意:我通常不会在代码隐藏中放置任何代码。而是将要绑定的代码放置在ViewModel中。诊断非常好!我刚刚右键单击该项,因此它未被选中。1.如何获取rcommandParameter中单击鼠标右键的项?2.我已为treeview中的每个节点创建usercontrol,usercontrol取决于模板。代码段:我已在usercontrol中创建contextmenu,如何将EditCommand绑定到treeview的DataContext的viewmodel?单击的项数据如何作为参数传递?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace WpfApplication1
{
  public class Command<T> : ICommand
  {
    private Action<T> _execute;
    private Predicate<T> _canExecute;

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

    public Command(Action<T> execute, Predicate<T> canExecute = null)
    {
        _execute = execute;
        _canExecute = canExecute;
    }
    public bool CanExecute(object parameter)
    {
        if (_canExecute == null) return true;
        return _canExecute((T)parameter);
    }

    public void Execute(object parameter)
    {
        _execute((T)parameter);
    }
  }
}
using System.Collections.Generic;
using System.Windows;
using System.Linq;
using System;
using System.Collections.ObjectModel;
using System.Windows.Input;
using WpfApplication1;

namespace WPF_Sandbox
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public ObservableCollection<string> Data { get; set; }  = new ObservableCollection<string>();
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            Data.Add("A");
            Data.Add("B");
            Data.Add("C");
        }

        public ICommand EditCommand
        {
            get
            {
                return new Command<object>(Edit);
            }
        }

        private void Edit(object param)
        {
            //Your code here
        }
    }    
}