103 lines
3.0 KiB
C#
103 lines
3.0 KiB
C#
|
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
|
|||
|
}
|
|||
|
}
|