如何将Treeview的SelectedItem传递给另一个命令?

时间:2011-08-18 14:48:57

标签: .net wpf mvvm wpf-controls binding

我在WPF MVVM中使用分层DAtaTemplate属性创建了一个树视图。

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

我在双击节点时在TreeviewItem中实现相同的功能。但是我想知道在外面实现这个目标的最佳方法是什么。

我的代码结构如下

MainView - > MainViewModel

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

RegionViewItem - > RegionViewModel(继承自TreeViewItemViewModel的DataTemplate)

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

然而,“EDIT”按钮位于树视图之外,如何将选定的RegionViewItem传递给Command界限,以便我可以加载它进行编辑?

提前感谢您的帮助

2 个答案:

答案 0 :(得分:1)

RegionViewModel是否可以访问StateViewModel?或者更重要的是,StateViewModel.SelectedItem? (有些代码会有所帮助)

如果没有,您可能必须实施一个事件系统,每当StateViewModel.SelectedItem更改时,它会广播StateChanged事件,RegionViewModel订阅该事件并跟踪SelectedState 1}}

答案 1 :(得分:1)

以下代码仅用于MVVM的指导目的。它可能/可能不会编译。

方式1:

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

在您的XAML树视图中,在Style的目标TreeViewItem中添加以下内容....

  <TreeView.Resources>
      <Style TargetType="{x:Type TreeViewItem}">
          <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
      </Style> 
  </TreeView.Resources>

这样,当选择任何TreeView时,只有它自己的TreeViewItemViewModel的{​​{1}}属性为真,其余所有树视图项都将为false。因此,剩下的任务是从绑定到IsSelected的{​​{1}}的对象层次结构中找到所选的TreeViewItemViewModel对象。

方式2:

拥有TreeViewItem的附加属性并处理其MouseDown事件。检查TreeViewItem的“IsSelected”值是否为true,并提取其选定的ItemsSource数据上下文。

TreeView

在静态HandleMouseDownPropertyChanged()依赖项属性更改方法中,处理TreeViewItemViewModel上的MouseDown事件...

  <TreeView.Resources>
      <Style TargetType="{x:Type TreeViewItem}">
          <Setter Property="local:MyAttachedBehavior.HandleMouseDown" Value="true" />
      </Style> 
  </TreeView.Resources>

将选定的`TreeViewItemViewModel'实例作为所需的选定项目传递给您的例程。

如果有帮助,请告诉我。