/// <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);
            });
        }