瀏覽代碼

Adding Custom Node Type to CoreTreeNodes

frankvandenbos 6 月之前
父節點
當前提交
780b79be17
共有 1 個文件被更改,包括 21 次插入13 次删除
  1. 21 13
      InABox.Core/CoreTreeNodes.cs

+ 21 - 13
InABox.Core/CoreTreeNodes.cs

@@ -122,42 +122,42 @@ namespace InABox.Core
         
     }
 
-    public class CoreTreeNodes<TKey>
+    public class CoreTreeNodes<TNode, TKey> where TNode : CoreTreeNode<TKey>
     {
-        private List<CoreTreeNode<TKey>> _nodes;
-        private Dictionary<TKey, CoreTreeNode<TKey>> _nodeMap;
+        private List<TNode> _nodes;
+        private Dictionary<TKey, TNode> _nodeMap;
         
         public TKey DefaultKey { get; set; }
 
-        public ObservableCollection<CoreTreeNode<TKey>> Nodes => new ObservableCollection<CoreTreeNode<TKey>>(_nodes.Where(x => Equals(x.Parent, DefaultKey)));
+        public ObservableCollection<TNode> Nodes => new ObservableCollection<TNode>(_nodes.Where(x => Equals(x.Parent, DefaultKey)));
         
-        public CoreTreeNode<TKey>? this[TKey id] => _nodeMap.GetValueOrDefault(id);
+        public TNode? this[TKey id] => _nodeMap.GetValueOrDefault(id);
         
         public CoreTreeNodes(TKey defaultKey)
         {
-            _nodes = new List<CoreTreeNode<TKey>>();
-            _nodeMap = new Dictionary<TKey, CoreTreeNode<TKey>>();
+            _nodes = new List<TNode>();
+            _nodeMap = new Dictionary<TKey, TNode>();
             DefaultKey = defaultKey;
         }
 
-        public CoreTreeNode<TKey> Add(TKey id, TKey parent, CoreRow row)
+        public TNode Add(TKey id, TKey parent, CoreRow row)
         {
-            var node = new CoreTreeNode<TKey>(this, id, parent, row);
+            var node = (TNode)Activator.CreateInstance(typeof(TNode), this, id, parent, row );
             _nodes.Add(node);
             _nodeMap[id] = node;
             return node;
         }
 
-        public CoreTreeNode<TKey> Find(TKey id) => _nodeMap.GetValueOrDefault(id);
+        public TNode Find(TKey id) => _nodeMap.GetValueOrDefault(id);
 
-        public CoreTreeNode<TKey>? Find(CoreRow row) => _nodes.FirstOrDefault(x => x.Row == row);
+        public TNode? Find(CoreRow row) => _nodes.FirstOrDefault(x => x.Row == row);
 
         /// <summary>
         /// Gets a given node and recursively all its children given by <paramref name="id"/>.
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        public IEnumerable<CoreTreeNode<TKey>> GetChildren(TKey id)
+        public IEnumerable<TNode> GetChildren(TKey id)
         {
             if(!_nodeMap.TryGetValue(id, out var node))
             {
@@ -175,7 +175,7 @@ namespace InABox.Core
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        public IEnumerable<CoreTreeNode<TKey>> GetChildrenOfParent(TKey id)
+        public IEnumerable<TNode> GetChildrenOfParent(TKey id)
         {
             return _nodes.Where(x => object.Equals(x.Parent, id) && !object.Equals(x.ID, id));
         }
@@ -199,4 +199,12 @@ namespace InABox.Core
             ColumnChanged?.Invoke(node, column);
         }
     }
+    
+    public class CoreTreeNodes<TKey> : CoreTreeNodes<CoreTreeNode<TKey>, TKey>
+    {
+        public CoreTreeNodes(TKey defaultKey) : base(defaultKey)
+        {
+            
+        }
+    }
 }