Sic.Framework-Nanjing-Baishi/Sicentury.Core/Tree/TreeNodeCollection.cs

103 lines
3.0 KiB
C#
Raw Normal View History

2023-04-13 11:51:03 +08:00
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using Sicentury.Core.Collections;
using Sicentury.Core.EventArgs;
namespace Sicentury.Core.Tree
{
public class TreeNodeCollection : ObservableRangeCollection<TreeNode>
{
#region Variables
public event EventHandler<TreeNodeSelectionChangedEventArgs> TerminalNodeSelectionChanged;
#endregion
#region Constructors
public TreeNodeCollection(TreeNode parent, IEnumerable<TreeNode> collection) : base(collection)
{
Parent = parent;
if (collection != null)
{
var list = collection.ToList();
foreach (var subNode in list)
{
subNode.ParentNode = Parent;
subNode.TerminalNodeSelectionChanged += SubNodeOnTerminalNodeSelectionChanged;
subNode.ChildNodesChanged += SubNodeOnChildNodesChanged;
}
}
}
public TreeNodeCollection(TreeNode parent) : this(parent, new TreeNode[0])
{
}
#endregion
#region Properties
/// <summary>
/// 父节点。
/// </summary>
public TreeNode Parent { get; }
#endregion
#region Methods
public override void AddRange(IEnumerable<TreeNode> collection)
{
var lst = collection?.ToList();
lst?.ForEach(subNode =>
{
subNode.ParentNode = Parent;
subNode.TerminalNodeSelectionChanged += SubNodeOnTerminalNodeSelectionChanged;
subNode.ChildNodesChanged += SubNodeOnChildNodesChanged;
});
base.AddRange(lst);
}
protected override void InsertItem(int index, TreeNode subNode)
{
if (subNode == null)
return;
subNode.ParentNode = Parent;
subNode.TerminalNodeSelectionChanged += SubNodeOnTerminalNodeSelectionChanged;
subNode.ChildNodesChanged += SubNodeOnChildNodesChanged;
base.InsertItem(index, subNode);
}
/// <summary>
/// 当子节点触发TerminalNodeSelectionChanged事件时调用该方法通知父节点。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SubNodeOnTerminalNodeSelectionChanged(object sender, TreeNodeSelectionChangedEventArgs e)
{
TerminalNodeSelectionChanged?.Invoke(this, e);
}
/// <summary>
/// 当某个节点的ChildNodes列表发生变化时调用该方法通知父节点。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SubNodeOnChildNodesChanged(object sender, NotifyCollectionChangedEventArgs e)
{
OnCollectionChanged(e);
}
#endregion
}
}