/// <summary> /// 创建权限树视图根节点,根节点即“所有权限”。 /// </summary> /// <returns></returns> private PermissionTreeViewModel CreateRoot() { var root = new PermissionTreeViewModel() { Text = "所有权限" }; ExtensionModelService.PermissionGroups.ForEach(pair => { // 创建二级视图节点,即插件 var bundle = new PermissionTreeViewModel() { Text = pair.Key.Name, Parent = root }; root.Children.Add(bundle); pair.Value.ForEach(group => // 创建子视图节点 { var groupPermissionTreeViewModel = new PermissionTreeViewModel() { Text = group.Name, Parent = bundle, Tag = group }; bundle.Children.Add(groupPermissionTreeViewModel); Initialize(groupPermissionTreeViewModel, group); } ); }); return(root); }
private void Initialize(PermissionTreeViewModel root) // 初始化权限树视图模型。 { PermissionTreeViewModels.Clear(); // 清空原有节点 PermissionTreeViewModels.Add(root); // 创建树 InitializePermissionSelected(); // 根据当前角色,选择其拥有的权限 }
protected void InitializePermissionSelected() { _initializePermissionSelected = true; // 如果当前角色为空,则默认不选择 if (UnselectAll()) { foreach (var permissionTreeViewModel in PermissionTreeViewModels) { permissionTreeViewModel.IsSelected = false; } } // 如果是管理员角色,默认全选 else if (SelectAll()) { foreach (var permissionTreeViewModel in PermissionTreeViewModels) { permissionTreeViewModel.IsSelected = true; } } else // 根据当前角色拥有的权限进行处理 { // 获取当前角色的权限 // 将递归转换成非递归,来设置子节点的选中情况 var permissionViewModels = new List <PermissionTreeViewModel>(); permissionViewModels.AddRange(PermissionTreeViewModels.ToArray()); PermissionTreeViewModel current = null; PermissionData permissionDefinition = null; while (permissionViewModels.Count > 0) // 如果列表不为空,继续初始化 { current = permissionViewModels[0]; permissionViewModels.RemoveAt(0); permissionViewModels.AddRange(current.Children); // 如果当前节点对应于PermissionData,则设置选中状态 if (current.Tag != null && !(current.Tag is PermissionGroupData)) { permissionDefinition = current.Tag as PermissionData; // 选中状态由数据库是否存在当前权限为准 current.IsSelected = IsSelected(permissionDefinition); // 监听当前叶子节点的选择变更事件,并自动同步数据库 current.PropertyChanged -= PermissionTreeViewModelPropertyChanged; current.PropertyChanged += PermissionTreeViewModelPropertyChanged; } } } _initializePermissionSelected = false; }
/// <summary> /// 选择所有子节点。 /// </summary> /// <param name="currentPermissionTreeViewModel">当前节点模型。</param> public void ChangeChildNodes(PermissionTreeViewModel currentPermissionTreeViewModel) { if (currentPermissionTreeViewModel.Children != null) { foreach (var data in currentPermissionTreeViewModel.Children) { // 更改子节点的选择属性 data._isSelected = currentPermissionTreeViewModel.IsSelected; data.RaisePropertyChanged("IsSelected"); if (data.Children != null) { // 递归更改子节点的子节点 data.ChangeChildNodes(data); } } } }
/// <summary> /// 向上遍历,更改父节点状态。 /// 注意:这里的父节点不是属性而是字段。 /// 采用字段的原因是因为不想让父节点触发访问器而触发Setter。 /// </summary> /// <param name="currentPermissionTreeViewModel">当前节点。</param> public void ChangedParentNodes(PermissionTreeViewModel currentPermissionTreeViewModel) { if (currentPermissionTreeViewModel.Parent != null) { bool parentNodeState = true; int selectedCount = 0; //被选中的个数 int noSelectedCount = 0; //不被选中的个数 foreach (var data in currentPermissionTreeViewModel.Parent.Children) { if (data.IsSelected == true) { selectedCount++; } else if (data.IsSelected == false) { noSelectedCount++; } } //如果全部被选中,则修改父节点为选中 if (selectedCount == currentPermissionTreeViewModel.Parent.Children.Count) { parentNodeState = true; } else { parentNodeState = false; } currentPermissionTreeViewModel.Parent._isSelected = parentNodeState; currentPermissionTreeViewModel.Parent.RaisePropertyChanged("IsSelected"); if (currentPermissionTreeViewModel.Parent.Parent != null) { ChangedParentNodes(currentPermissionTreeViewModel.Parent); } } }
/// <summary> /// 递归创建权限树视图模型。 /// </summary> /// <param name="groupTreeViewModel"></param> /// <param name="group"></param> private void Initialize(PermissionTreeViewModel groupTreeViewModel, PermissionGroupData group) { group.Children.ForEach(childGroup => { // 如果是组,则需要递归初始化视图模型 var childGroupTreeViewModel = new PermissionTreeViewModel() { Text = childGroup.Name, Parent = groupTreeViewModel, Tag = childGroup }; groupTreeViewModel.Children.Add(childGroupTreeViewModel); Initialize(childGroupTreeViewModel, childGroup); }); group.Permissions.ForEach(permission => { // 如果是权限,则已经是叶子节点 var permissionTreeViewModel = new PermissionTreeViewModel() { Text = permission.Name, Parent = groupTreeViewModel, Tag = permission }; groupTreeViewModel.Children.Add(permissionTreeViewModel); }); }