Sic.Framework/Sicentury.Core/Tree/TreeNodeCollection.cs

103 lines
3.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}