2011-08-18 80 views
0

我使用分层DAtaTemplate属性在WPF MVVM中创建了一个树视图。如何将TreeView的SelectedItem传递给另一个命令?

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

我在TreeviewItem中双击节点实现相同的功能。不过,我想知道在外面完成这件事的最佳方法是什么。

我的代码结构如下

的MainView - > MainViewModel

StateViewItem - > StateViewModel(HierarchicalDataTemplate从TreeViewItemViewModel继承)

RegionViewItem - > RegionViewModel(DataTemplate中从TreeViewItemViewModel继承)

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

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

预先感谢帮助

回答

1

是否RegionViewModel有机会获得StateViewModel?或者更重要的是,StateViewModel.SelectedItem? (某些代码将是有益的)

如果没有,你可能要实现事件系统中,每当StateViewModel.SelectedItem变化,它广播StateChanged事件,RegionViewModel订阅了该事件并跟踪SelectedState

+0

感谢您的回答! RegionViewModel有一个父属性,可以访问StateViewModel。 StateViewModel有一个Children属性,它是RegionViewModel的集合。我不允许发布项目代码,但如果你需要我会创建一个repro并发布它 – ganeshran

+0

我认为我错读了你的问题......你有两种编辑方法,一种是在RegionViewModel中,它可以在双击上工作,一个在MainViewModel(?)中应该在Button Click上工作? – Rachel

+0

我在RegionViewModel中有一个编辑方法,它将消息传递到另一个视图模型以加载要编辑的区域。 在MainViewModel中,我想要访问在Treeview中选择的RegionViewModel对象,这样我就可以传递消息来加载区域进行编辑 – ganeshran

1

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

方法1:

假设你TreeViewItemViewModel是树中的所有树视图项的基本项目的水平视图模型数据上下文,加入TreeViewItemViewModel可写属性调用IsSelected。不要忘记通知IsSelected的安装人员。

在您的XAML树视图中添加的Style以下针对性的TreeViewItem ....

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

当任何TreeView中被选中这样一来,只有自己的TreeViewItemViewModelIsSelected属性将是真实的,并休息所有树视图项目将是错误的。因此,剩下的任务是从与TreeViewItemsSource绑定的对象的层次结构中找到所选的TreeViewItemViewModel对象。

方式2:

有一个TreeViewItem附加属性和处理其MouseDown事件。检查TreeViewItem的“IsSelected”值是否为真,并提取其数据上下文,该数据上下文将是选定的TreeViewItemViewModel

<TreeView.Resources> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="local:MyAttachedBehavior.HandleMouseDown" Value="true" /> 
     </Style> 
    </TreeView.Resources> 
静态HandleMouseDownPropertyChanged()依赖属性改变的方法

,关于办理(TreeViewItem)sender 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; 
     } 
    } 

通过这个选择`TreeViewItemViewModel”实例为需要选择的项目到你的日常。

让我知道这是否有帮助。

+0

谢谢我现在正在尝试Way1。会让你知道它是否有效 – ganeshran

相关问题