using HandyControl.Controls; using Ping9719.WpfEx.Mvvm; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WCS.Model; namespace 智能仓储WCS管理系统.ViewModel { //https://dandelioncloud.cn/article/details/1472765022102446082 public class RoleEditTreeViewModel : BindableBase, ITreeNode { private bool IsSelect_; /// /// 是否选择 /// public bool IsSelect { get => IsSelect_; set { SetProperty(ref IsSelect_, value); Linkage(value); } } /// /// 名称 /// public string Name { get; set; } /// /// 主键Id /// public object Id { get; set; } /// /// 父Id /// public object Pid { get; set; } /// /// 父级 /// public RoleEditTreeViewModel Parent { get; set; } /// /// 子级 /// public List Children { get; set; } /// /// 联动 /// public void Linkage(bool newbool) { //父级增加联动 if (newbool && Parent != null) Parent.IsSelect = true; //子级联动 if (!newbool && Children != null) foreach (var item in Children) item.IsSelect = false; } /// /// 得到数据 /// /// 选中的值 /// public static List GetTreeViewModel(List select) { //值,名称,父级,子级 List>> quan = new List>>(); List vmodel = new List(); //1:解析枚举 { Type type = typeof(AuthEnum); var fields = type.GetFields(BindingFlags.Static | BindingFlags.Public) ?? new FieldInfo[] { }; foreach (var field in fields) { var attr = field.GetCustomAttribute(false); var attr1 = field.GetCustomAttribute(false); var v0 = Convert.ToInt32(field.GetRawConstantValue()); var v1 = attr1 == null ? field.Name : attr1.Description; var v2 = (int?)attr?.Parent; var v3 = attr?.Childs?.Select(o => (int)o)?.ToList(); quan.Add(new Tuple>(v0, v1, v2, (v3 ?? new List()))); } } //2:翻译数据 { vmodel.AddRange(quan.Select(o => new RoleEditTreeViewModel() { Id = o.Item1, Name = o.Item2, Pid = 0, IsSelect = select?.Contains(o.Item1) ?? false, })); //父子 foreach (var item in vmodel) { var f = quan.FirstOrDefault(o => o.Item1 == (int)item.Id)?.Item3; if (f.HasValue) { item.Parent = vmodel.FirstOrDefault(o => (int)o.Id == f.Value); item.Pid = item.Parent.Id; } var ff = quan.FirstOrDefault(o => o.Item1 == (int)item.Id)?.Item4; if (ff != null && ff.Any()) { foreach (var item2 in ff) { vmodel.FirstOrDefault(o => (int)o.Id == item2).Parent = item; vmodel.FirstOrDefault(o => (int)o.Id == item2).Pid = item.Id; } } } } //3:数据转为树对象 vmodel = vmodel.ToTree(); return vmodel; } } }