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



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

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

|根|---|子级别1|------|次级2|---------|Sublevel 3

根据用户登录的角色,我需要将树的根作为子级别之一,例如:

  • 如果我是管理员,请显示上面列出的整个树
  • 如果我是超级用户,请在子级别1启动树
  • 如果我是普通用户,则显示从SubLevel2开始的树

这样做的最佳方法是什么?我基本上有4个用户角色,所以我考虑过简单地创建4个版本的树,并根据用户角色选择性地显示正确的树,但我相信还有更好的方法。

如果树视图基本上显示相同的数据,那么不要创建四个单独的树视图。那是多余的,保持干燥。根据当前活动的角色填充单个TreeView

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

private MyNodeType _root;

此根包含层次结构数据。公开表示树数据结构的顶级集合的属性,以便绑定到单个TreeViewItemsSource

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;

当然,您也可以删除_root备份属性,并在每次用户更改时加载、搜索和分配正确的集合,这取决于您的需求。

最新更新