c# - TreeView 项目更改事件

标签 c# wpf treeview

为了向 native WPF TreeView 添加多选支持,我必须添加一个自定义依赖属性来存储多选项目。在树的项目开始改变之前,这很好用。

例如在初始树中有一个项目 A。我选择了它,它存储在 MultiSelectedItems 列表中。然后我删除了项目 A 并添加了项目 B。(通过 ViewModel ObservableCollection 绑定(bind))

发生这种情况时,我需要找到一种方法从 MultiSelectedItems 列表中删除项目 A。

我找不到与此相关的事件。我得到的最接近的是 ItemContainerGenerator.ItemsChanged 事件,但此事件仅针对根级别节点触发(不会针对其层次结构子节点触发)。

最佳答案

不幸的是,这是一个复杂的问题,在 WPF 中有多种实现 TreeView 的方法,这只会使问题变得更加复杂。如果您使用 MVVM、虚拟化和 HierarchicalDataTemplates,则所选项目在任何给定时间甚至可能都不是视觉树或逻辑树的一部分 - 更不用说即使试图观察单个项目的删除也会这还不够,因为它的任何祖先都可能被移除。

我的建议是在控件级别实现简单的 MultiSelection,并实现智能的 ViewModel 层次结构:

允许在您的 ViewModel 层次结构中访问“Parent”和“Root”节点,并允许项目在其子集合更改时从 Root.SelecteItems 集合中删除其后代。

在我的 MVVM 框架中,我有一个 HierarchicalRootViewModelBase 和一个用于所有层次结构 VM 的 HierarchicalViewModelBase。这样,所有树功能(如选择和集合更改事件)都实现一次并自动处理。每个基类都是通过对其父节点和 Root 节点的引用构造的(或者它使用递归来查找 Root)。

通过这种方式,在任何层次结构深度删除项目都可以轻松触发根级操作,例如检查/更新 SelectedItems 集合。

关于c# - TreeView 项目更改事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39794341/

相关文章:

c# - TreeView 控件 展开

c# - 如何在 asp.net 中扩展用户控件?

c# - 如何从 [Serializable] INotifyPropertyChanged 实现者中排除不可序列化的观察者?

WPF:如何使文本 block 触发按键事件?

c# - 在 WPF 中通过 XAML 代码加载外部图像?

c# - 在 WPF 中,如何在设计 View 中将样式应用于 UserControl?

c# - 编写自定义 HTML 日志

c# - 最适合模型的位图类

JavaFX:在 TreeView 中显示存储的 CheckBoxTreeItem 选择

javascript - 如何在angularJS中解析Json字符串?