それがツリーの場合、親のリストは必要ありませんが、親への参照のみが必要です。
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;
}
このソリューションは、最初のソリューションよりも複雑です。親オブジェクトはその子を追跡し、子が追加されるたびに子オブジェクトの親がそれに設定されていることを確認する必要があります。
構文チェックなしでこのコードを入力してきましたが、的を得ています。この記事で、ほぼ同じ質問のソース コード全体を見つけることができます: How to Implement Collection Property to Contain Unique Objects .
編集:上記のコードのクラスでは、呼び出し元がコレクションItem
を設定できないことに注意してください。ItemChildren
そのコレクションは Item インスタンスによって作成および提供され、誰もそれを変更することはできません。ただし、誰でもアイテムを追加/削除できます。もう 1 つは、Item が新しく追加された子アイテムを処理する方法です。InvalidOperationException
誰かが null 以外の親参照を持つアイテムを追加しようとすると、自由にスローできます。これにより、構造がツリーのままになります。たとえば、引数がすでに現在のノードの祖先である場合、XmlNode
クラス ( ) はメソッドからSystem.Xml
スローします。追加された要素を検証する機会があれば、可能性は無限大です。InvalidOperationException
AppendChild
Item