我有一个 TreeView,它有多个根节点,每个根节点都包含子节点。我想添加将子节点添加到“收藏夹”根节点的功能(最初,此节点不存在,只有在需要添加某些内容时才会出现)。当然,Favorites 节点是原始 TreeView 的一部分。节点是通过上下文菜单添加的(严格来说是一项),删除也应该通过上下文菜单完成(如果已经添加了节点,则用添加的项替换),但是这里开始出现问题。对于这个问题,网上有几种解决方法:
- 向资源添加不同的上下文菜单,将树拆分为几棵树,将它们一个接一个地放置,并为每个部分指定适当的菜单。这也许可以解决我的问题,但我不想分割树。
- 使用交互性。
- 为 xaml.cs 中的节点填充菜单,但这个选项绝对不适合我。
但这不是我所需要的。没有违反 MVVM、拆分源树并包含包的干净方法,这将允许您为 TreeView 制作非统一的上下文菜单?
这是它对我的工作方式。
首先,我们需要一个元素的类。我参加了一个简单的课程,当然,你会有更复杂的东西。
接下来,我们需要一个包含
ObservableCollection
“收藏夹”和“其他”的容器类。此外,我们需要从“收藏夹”中添加/删除项目的命令。结果是这样的:接下来,XAML。让我们输入
TreeView
三个元素:完整列表、收藏夹和其他所有内容。Count
可见性将通过转换器绑定到相应列表的大小(我们将使用通过绑定动态“捕获”更改的事实)。对于列表的不同部分,我们将放置不同的上下文菜单,我们将通过样式
TreeViewItem
'a. 为了不重复我们自己,让我们为资源添加样式。由于命令是在外部级别定义的,并且在内部级别无法直接访问 external
DataContext
'y,因此我们将通过DataContext
虚拟元素绑定命令。如果需要,实施
TrivialCommand
:以及
NonzeroToVisibilityConverter
:结果是这样的: