我在WPF MVVM中使用分层DAtaTemplate属性创建了一个树视图。
在Treeview之外,我有一个“编辑”按钮。按下编辑按钮我想将Treeview的selectedItem传递给viewmodel中的RelayCommand。
我在双击节点时在TreeviewItem中实现相同的功能。但是我想知道在外面实现这个目标的最佳方法是什么。
我的代码结构如下
MainView - > MainViewModel
StateViewItem - > StateViewModel(继承自TreeViewItemViewModel的HierarchicalDataTemplate)
RegionViewItem - > RegionViewModel(继承自TreeViewItemViewModel的DataTemplate)
RegionViewModel处理节点的双击并完成编辑功能。
然而,“EDIT”按钮位于树视图之外,如何将选定的RegionViewItem传递给Command界限,以便我可以加载它进行编辑?
提前感谢您的帮助
答案 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'实例作为所需的选定项目传递给您的例程。
如果有帮助,请告诉我。