如果那是树,那么您不需要父母列表,而只需要对父母的引用:
public class Item
{
public Item()
{
_col = new ObservableCollection<Item>();
_col.CollectionChanged +=
new NotifyCollectionChanged(ItemChildren_CollectionChanged);
}
public Header { get; set; }
public ObservableCollection<Item> ItemChildren
{ get { return _col; } }
public Item Parent { get { return _parent; } }
private void ItemChildren_CollectionChanged(
object sender,
NotifyCollectionChangedEventArgs e)
{
// for all newly added items: item._parent = this;
// for all removed items: item._parent = null;
}
private Item _parent;
private ObservableCollection<Item> _col;
}
此解决方案比您开始使用的解决方案更复杂。父对象必须跟踪其子对象,并确保每次将子对象添加到子对象时都将其设置为子对象的父对象。
我一直在输入这段代码而没有进行语法检查,但它恰到好处。您可以在本文中找到几乎相同问题的完整源代码:如何实现集合属性以包含唯一对象。
编辑:请注意,Item
上面代码中的类不允许调用者设置ItemChildren
集合。该集合由 Item 实例创建和服务,并且不允许任何人更改它。但是任何人都可以在其中添加/删除项目。另一件事是 Item 处理新添加的子项的方式 -InvalidOperationException
如果有人尝试添加具有非 null Parent 引用的项,您可以随意抛出!这将确保您的结构仍然是树。例如,如果参数已经是当前节点的祖先,则XmlNode
class ( )从方法中System.Xml
抛出。当有机会验证添加到其中的元素时,可能性是无穷无尽的。InvalidOperationException
AppendChild
Item