Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我如何通过树景';s选择EdItem以执行另一个命令?_.net_Wpf_Mvvm_Wpf Controls_Binding - Fatal编程技术网

.net 我如何通过树景';s选择EdItem以执行另一个命令?

.net 我如何通过树景';s选择EdItem以执行另一个命令?,.net,wpf,mvvm,wpf-controls,binding,.net,Wpf,Mvvm,Wpf Controls,Binding,我在WPF MVVM中创建了一个具有分层DAtaTemplate属性的树视图 在树视图之外,我有一个“编辑”按钮。按下编辑按钮时,我想将Treeview的selectedItem传递给viewmodel中的RelayCommand 双击节点后,我在TreeviewItem中实现了相同的功能。然而,我想知道什么是最好的方式来实现这一点以外 我的代码结构如下 主视图->主视图模型 StateViewItem->StateViewModel(继承自TreeViewItemViewModel的Hiera

我在WPF MVVM中创建了一个具有分层DAtaTemplate属性的树视图

在树视图之外,我有一个“编辑”按钮。按下编辑按钮时,我想将Treeview的selectedItem传递给viewmodel中的RelayCommand

双击节点后,我在TreeviewItem中实现了相同的功能。然而,我想知道什么是最好的方式来实现这一点以外

我的代码结构如下

主视图->主视图模型

StateViewItem->StateViewModel(继承自TreeViewItemViewModel的HierarchycalDataTemplate)

RegionViewItem->RegionViewModel(从TreeViewItemViewModel继承的数据模板)

RegionViewModel处理节点的双击并完成编辑功能

但是“编辑”按钮在树状视图之外,如何将选定的RegionViewItem传递给命令绑定,以便加载它进行编辑


提前感谢您的帮助

区域视图模型是否可以访问状态视图模型?或者更重要的是,转到
状态视图模型。选择editem
?(一些代码可能会有帮助)


如果没有,您可能必须实现一个事件系统,在该系统中,只要
StateViewModel.SelectedItem
更改,它就会广播
StateChanged
事件,并且
RegionViewModel
订阅该事件并跟踪
SelectedState
下面的代码仅用于MVVM的指导目的。它可能会/可能不会编译

方式1:

假设您的
TreeViewItemModel
是树中所有树视图项的基本项级视图模型数据上下文,请在
TreeViewItemModel
中添加名为
IsSelected
的可写属性。别忘了在
IsSelected
的Setter中通知属性更改

在XAML树视图中,在针对
treevieItem
样式中添加以下内容

  <TreeView.Resources>
      <Style TargetType="{x:Type TreeViewItem}">
          <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
      </Style> 
  </TreeView.Resources>
在静态HandleMouseDownPropertyChanged()dependency property changed方法中,处理
(TreeViewItem)发送方上的MouseDown事件

  ((TreeViewItem)sender).MouseDown += TreeViewMouseDownEventHandler;

  private static TreeViewMouseDownEventHandler(object sender, MouseButtonEventArgs e)
  {
      var treeViewItem = (TreeViewItem)sender;
      if (treeViewItem.IsSelected)
      {
            var mySelectedItem = treeViewItem.DataContext as TreeViewItemViewModel; 
      } 
  }
将此选定的“TreeViewItemModel”实例作为所需的选定项传递给例程


如果有帮助,请告诉我。

谢谢您的回答!!RegionViewModel有一个父属性,可以在其中访问StateViewModel。StateViewModel有一个Children属性,它是RegionViewModel的集合。我不允许发布项目代码,但如果你需要,我会创建一个复制并发布它,我想我看错了你的问题。。。您是否有两种编辑方法,一种在RegionViewModel中可以双击,另一种在MainViewModel(?)中可以单击按钮?我在RegionViewModel中有一种编辑方法,它将消息传递给另一个视图模型以加载区域进行编辑。在MainViewModel中,我想访问在Treeview中选择的RegionViewModel对象,以便传递消息以加载区域进行编辑您的
MainViewModel
是否可以访问
StateViewModel
MainView
访问
Treeview
?如果您可以在问题中用伪代码绘制XAML布局或ViewModel层次结构,这将是最简单的。您好,我使用MVVM Light中的消息传递实现了这一点。谢谢,我现在正在尝试方法1。会让你知道它是否有效
  ((TreeViewItem)sender).MouseDown += TreeViewMouseDownEventHandler;

  private static TreeViewMouseDownEventHandler(object sender, MouseButtonEventArgs e)
  {
      var treeViewItem = (TreeViewItem)sender;
      if (treeViewItem.IsSelected)
      {
            var mySelectedItem = treeViewItem.DataContext as TreeViewItemViewModel; 
      } 
  }