From 12e606635c42ea20f4b7c2bdda5204237a4b4c96 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期一, 02 三月 2026 16:14:49 +0800
Subject: [PATCH] 优化

---
 HMI.UI/Controls/treegrid/Controls/TreeItemData.cs |  280 +++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 187 insertions(+), 93 deletions(-)

diff --git a/HMI.UI/Controls/treegrid/Controls/TreeItemData.cs b/HMI.UI/Controls/treegrid/Controls/TreeItemData.cs
index 46a045c..c49c447 100644
--- a/HMI.UI/Controls/treegrid/Controls/TreeItemData.cs
+++ b/HMI.UI/Controls/treegrid/Controls/TreeItemData.cs
@@ -4,8 +4,10 @@
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Collections.Specialized;
+using System.ComponentModel;
 using System.Globalization;
 using System.Linq;
+using System.Reflection;
 using System.Windows.Data;
 
 namespace HMI.UI
@@ -32,10 +34,10 @@
             get => _IsExpanded;
             set
             {
-                if (_IsExpanded == value)
-                {
-                    return;
-                }
+                //if (_IsExpanded == value)
+                //{
+                //    return;
+                //}
                 _IsExpanded = value;
                 Set("IsExpanded");
                 SetItemsVisible(value);
@@ -43,6 +45,84 @@
             }
         }
         #endregion
+
+        #region 灞炴�� IsVisible
+        private bool _IsVisible = true;
+
+        public bool IsVisible
+        {
+            get
+            {
+                return _IsVisible;
+            }
+            set
+            {
+                if (_IsVisible == value)
+                {
+                    return;
+                }
+                _IsVisible = value;
+                Set("IsVisible");
+                SetItemsVisible(value);
+                VisibleChange?.Invoke(this, value);
+            }
+        }
+
+        /// <summary>
+        /// 鐢ㄤ簬灞曞紑鐨勫彲瑙�
+        /// </summary>
+        /// <param name="visible"></param>
+        private void SetItemsVisible(bool visible)
+        {
+            if (IsExpanded == false || visible == false)
+            {
+                Items.ForEach(p => p.IsVisible = false);
+            }
+            else
+            {
+                Items.ForEach(p => p.IsVisible = true);
+            }
+        }
+
+        /// <summary>
+        /// 璁剧疆绛涢�夋槸鍚﹀彲瑙侊紝姣斿绛涢�塶ame1,鍒欏寘鍚玭ame1鐨勬暟鎹拰鍏剁埗鑺傜偣閮藉彲瑙�
+        /// </summary>
+        public bool SelectVisible
+        {
+            get
+            {
+                return _IsVisible;
+            }
+            set
+            {
+                if (_IsVisible == value)
+                {
+                    return;
+                }
+                _IsVisible = value;
+                Set("IsVisible");
+                SetItemsVisible(value);
+            }
+        }
+
+        /// <summary>
+        /// 鐢ㄤ簬绛涢�夌殑鍙
+        /// </summary>
+        /// <param name="visible"></param>
+        private void SetSelectVisible(bool visible)
+        {
+            if (visible)
+            {
+                ParentItem.SelectVisible = visible;
+            }
+            Items.ForEach(p => p.IsVisible = visible);
+        }
+        #endregion
+
+        public void NotifyUI()
+        {
+            IsExpanded = _IsExpanded;
+        }
 
         #region 灞炴�� Level
         private int _Level = 0;
@@ -107,6 +187,18 @@
             }
         }
         #endregion
+
+        /// <summary>
+        /// 鎵�鏈夊瓙椤规暟閲�
+        /// </summary>
+        private int allSubCount;
+
+        public int AllSubCount
+        {
+            get { return allSubCount; }
+            set { allSubCount = value; }
+        }
+
 
         #region 灞炴�� ParentItem
         private TreeItemData _ParentItem = null;
@@ -196,79 +288,6 @@
                 Set("IconType");
             }
         }
-        #endregion 
-
-        #region 灞炴�� IsVisible
-        private bool _IsVisible = true;
-
-        public bool IsVisible
-        {
-            get
-            {
-                return _IsVisible;
-            }
-            set
-            {
-                if (_IsVisible == value)
-                {
-                    return;
-                }
-                _IsVisible = value;
-                Set("IsVisible");
-                SetItemsVisible(value);
-                VisibleChange?.Invoke(this, value);
-            }
-        }
-
-        /// <summary>
-        /// 鐢ㄤ簬灞曞紑鐨勫彲瑙�
-        /// </summary>
-        /// <param name="visible"></param>
-        private void SetItemsVisible(bool visible)
-        {
-            if (IsExpanded == false || visible == false)
-            {
-                Items.ForEach(p => p.IsVisible = false);
-            }
-            else
-            {
-                Items.ForEach(p => p.IsVisible = true);
-            }
-        }
-
-        /// <summary>
-        /// 璁剧疆绛涢�夋槸鍚﹀彲瑙侊紝姣斿绛涢�塶ame1,鍒欏寘鍚玭ame1鐨勬暟鎹拰鍏剁埗鑺傜偣閮藉彲瑙�
-        /// </summary>
-        public bool SelectVisible
-        {
-            get
-            {
-                return _IsVisible;
-            }
-            set
-            {
-                if (_IsVisible == value)
-                {
-                    return;
-                }
-                _IsVisible = value;
-                Set("IsVisible");
-                SetItemsVisible(value);
-            }
-        }
-
-        /// <summary>
-        /// 鐢ㄤ簬绛涢�夌殑鍙
-        /// </summary>
-        /// <param name="visible"></param>
-        private void SetSelectVisible(bool visible)
-        {
-            if (visible)
-            {
-                ParentItem.SelectVisible = visible;
-            }
-            Items.ForEach(p => p.IsVisible = visible);
-        }
         #endregion
 
         int GetIconType()
@@ -310,6 +329,9 @@
         string _ItemsPath = "";
 
         List<TreeItemData> _RootItems = new List<TreeItemData>();
+        List<TreeItemData> levelOneItems = new List<TreeItemData>();
+
+        private PropertyInfo subDataProperty;
 
         #region 灞炴�� UseTree
         private bool _UseTree = true;
@@ -324,6 +346,12 @@
                 _UseTree = value;
             }
         }
+
+        public List<TreeItemData> RootItems
+        {
+            get => _RootItems;
+        }
+
         #endregion
 
         public TreeItemDataCollection()
@@ -341,15 +369,68 @@
             }
             UseTree = useTree;
             ResetItems();
+            //subDataProperty = typeof(T).GetProperty(itemsPath);
+        }
+
+        protected override void MoveItem(int oldIndex, int newIndex)
+        {
+            CheckReentrancy();
+            TreeItemData source = base[oldIndex];
+            TreeItemData target = base[newIndex];
+            newIndex += target.AllSubCount;
+            if (newIndex == oldIndex - 1)
+            {
+                return;
+            }
+            target = base[newIndex];
+            int times = source.AllSubCount;
+
+            if (oldIndex < newIndex)
+            {
+                base.RemoveItem(oldIndex);
+                base.InsertItem(newIndex, source);
+                OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
+                /// 浠庝笂寰�涓嬫媺
+                for (int i = 0; i < times; i++)
+                {
+                    CheckReentrancy();
+                    source = base[oldIndex];
+                    target = base[newIndex];
+                    base.RemoveItem(oldIndex);
+                    base.InsertItem(newIndex, source);
+                    OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
+                }
+            }
+            else if (oldIndex > newIndex)
+            {
+                /// 浠庝笅寰�涓婃媺
+                base.RemoveItem(oldIndex);
+                base.InsertItem(++newIndex, source);
+                OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
+                //MessageBox.Show($"source: {source.Data} {oldIndex}; target: {target.Data} {newIndex}");
+                for (int i = 0; i < times; i++)
+                {
+                    oldIndex++;
+                    newIndex++;
+                    CheckReentrancy();
+                    source = base[oldIndex];
+                    target = base[newIndex];
+                    //MessageBox.Show($"source: {source.Data} {oldIndex}; target: {target.Data} {newIndex}");
+                    base.RemoveItem(oldIndex);
+                    base.InsertItem(newIndex, source);
+                    OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
+                }
+            }
         }
 
         private void List_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
         {
-            ResetItems();
+            //ResetItems();
         }
 
-        private void ResetItems()
+        public void ResetItems()
         {
+            CheckReentrancy();
             if (_SourceItems is null)
             {
                 ClearAllItems();
@@ -359,7 +440,8 @@
             var items = new List<TreeItemData>();
             _RootItems.Clear();
 
-            var list = this.Items.ToDictionary(l => l.Data);
+            Dictionary<dynamic, TreeItemData> list = this.Items.
+                ToLookup(t => t.Data, t => t).ToDictionary(t => t.Key, t => t.First());
             foreach (var item in _SourceItems)
             {
                 if (list.TryGetValue(item, out var treeItem))
@@ -375,8 +457,9 @@
                 treeItem.Level = 0;
                 items.Add(treeItem);
                 _RootItems.Add(treeItem);
-
-                foreach (var sitem in GetSubItems(treeItem, _ItemsPath, list).ToList())
+                var subItems = GetSubItems(treeItem, _ItemsPath, list);
+                treeItem.AllSubCount = subItems.Count();
+                foreach (var sitem in subItems)
                 {
                     items.Add(sitem);
                 }
@@ -385,17 +468,20 @@
             ResetSubItems(_RootItems);
 
             this.Items.Clear();
-            if (UseTree)
-            {
-                _RootItems.ForEach(t => this.Items.Add(t));
-            }
-            else
-            {
-                items.ForEach(t => this.Items.Add(t));
-            }
+            items.ForEach(t => this.Items.Add(t));
+            //if (UseTree)
+            //{
+            //    _RootItems.ForEach(t => this.Items.Add(t));
+            //}
+            //else
+            //{
+            //    items.ForEach(t => this.Items.Add(t));
+            //}
+            OnPropertyChanged(new PropertyChangedEventArgs("Count"));
+            OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
         }
 
-        private void ResetSubItems(List<TreeItemData> items)
+        public static void ResetSubItems(IList<TreeItemData> items)
         {
             for (int i = 0; i < items.Count; i++)
             {
@@ -410,6 +496,13 @@
             var data = treeItem.Data;
             var p = data.GetType().GetProperty(itemsPath);
             var pvalue = p.GetValue(data, null);
+
+            if (pvalue is INotifyCollectionChanged inc)
+            {
+                //inc.CollectionChanged -= List_CollectionChanged;
+                //inc.CollectionChanged += List_CollectionChanged;
+            }
+
             treeItem.Items.Clear();
             if (pvalue is IEnumerable subItems)
             {
@@ -436,8 +529,9 @@
 
                     treeItem.Items.Add(subitem);
                     yield return subitem;
-
-                    foreach (var sitem in GetSubItems(subitem, itemsPath, list))
+                    var subSub = GetSubItems(subitem, itemsPath, list);
+                    subitem.AllSubCount = subSub.Count();
+                    foreach (var sitem in subSub)
                     {
                         yield return sitem;
                     }

--
Gitblit v1.9.1