有条件地显示WPF树视图级别

问题描述

我在WPF中使用了TreeViewHierarchicalDataTemplate,并且需要使用一些逻辑来确定我的数据结构的哪个级别应该是树中的根节点。

我绑定TreeView的数据结构是这样的:

|Root
|---|Sublevel1
|------|SubLevel2
|---------|Sublevel3

基于用户登录的角色,我需要将树的根目录设为子级别之一,例如:

  • 如果我是 Admin ,请显示上面列出的整个树。
  • 如果我是高级用户,请在 Sublevel1 处启动树。
  • 如果我是普通用户,请显示 SubLevel2 开始的树。

执行此操作的最佳方法是什么?我基本上有4个用户角色,所以我想简单地创建4个版本的树并根据用户角色有选择地显示正确的树的想法,但是我敢肯定有更好的方法

解决方法

如果树视图本质上显示相同的数据,则不要创建四个单独的树视图。那是多余的,请保留为DRY。根据当前活跃的角色填充单个TreeView

让我们假设您的视图模型中有一个包含分层树数据结构的集合。通常,存在一个根节点或一个公共节点数据类型的节点集合,其中包含ObservableCollection个子节点。

private MyNodeType _root;

此根包含层次结构数据。公开一个属性,该属性表示树数据结构的顶级集合,用于绑定到单个ItemsSource的{​​{1}}。

TreeView

实现private ObservableCollection<MyNodeType> _roles; public ObservableCollection<MyNodeType> Roles { get => _roles; set { if (_roles == value) return; _roles = value; OnPropertyChanged(); } } 很重要,如果您可以在运行时更改角色,因为这样您将分配一个不同的集合,而不会引发INotifyPropertyChanged事件,因此绑定以及关联的控件将不会更新其价值。

现在,如果您更改了应用程序中的角色,则可以在PropertyChanged成员中搜索匹配的角色,并将相应的子集合直接分配给_root属性,例如Roles(假设子集合属性为Sublevel1)。

Children

当然,您还可以删除Roles = _root.Children; 后备属性,并根据您的要求在每次用户更改时加载,搜索和分配正确的集合。