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