2011-08-12 9 views
5

特定のインスタンスアイテムを削除したいと思うコレクションがあります。Observableコレクションからの削除

data[1].ChildElements[0].ChildElements[1].ChildElements.RemoveAt(1);

これは正常に動作し、これはツリービューから子要素を削除することに関連しているとして、しかし、私は動的にクリックされたツリービューのどのレベルに応じて上記のステートメントを作成したいです。だから私はしたいこと:

data[0].ChildElements[1].ChildElements.RemoveAt(0);

または

data[1].ChildElements.RemoveAt(0);

を私はリストに離れて保存されている親アイテムのIDを知っている、例えば

0 1 0または1,0

私の質問は、私は、私は、リストのコレクションであることをそこに行くされている正確にどのように多くの項目を知らない時には、上記の文を作成する行くのですかですか?

ありがとうございました。

+1

質問のタイトルは少し誤解を招く。あなたはObservableCollectionを特に使用しているかもしれませんが、質問はObservableCollectionとは関係ありません。この問題は、ObservableCollectionまたは配列またはリストを使用して実装されている場合でも、再帰的なデータ構造でも同じです。 – Davy8

答えて

0

実際の/現在のノードを与えることができる再帰関数を使用し、バインドされたObservableCollectionを見つけてそこから削除することができます。このような

+0

私は既に親IDと選択されたアイテムを見つける再帰関数を持っていますが、実際にコレクションからアイテムを削除するステートメントの生成方法はわかりません。あなたのコレクション構造が与えられている –

+0

が同じです(つまり、親には常に子「ノード」コレクションがあります)。あなたが望むObservableCollectionを与えるのに同じ再帰関数を使用できませんか? –

0

何か:

private void RemoveSpecificInstance(IList<int> ids, ObservableCollection<SomeClass> currentCollection) 
    { 
     if (ids.Count == 0) 
     { 
      // The initial collection didn't have children 
      return; 
     } 
     else if (ids.Count == 1) 
     { 
      currentCollection.RemoveAt(ids.Single()); 
     } 
     else 
     { 
      int index = ids.First(); 

      RemoveSpecificInstance(ids.Skip(1).ToList(), currentCollection[index].ChildElements); 
     } 
    } 
1

時には昔の学校は最高のそれをしません。あなたは「ルート」YourClassインスタンスを持っていない場合は

static void RemoveByPath(YourClass currentNode, int[] path) 
    { 
     for (int i = 0; i < path.Length - 1; i++) 
     { 
      currentNode = currentNode.ChildElements[path[i]]; 
     } 
     currentNode.ChildElements.RemoveAt(path[path.Length-1])); 
    } 

(私はあなたがたが念の疑いがある)を追加します - あなたは賢い何かをしたいですか場合

static void RemoveByPath(IList<YourClass> data, int[] path) 
{ 
    if (path.Length > 1) 
    { 
     RemoveByPath(data[path[0]], path.Skip(1).ToArray()); 
    } 
    else 
    { 
     data.RemoveAt(path[0]); 
    } 
} 

を、あなたはなるかもしれませんこれらを拡張メソッドに変換します。

+0

私は再帰的ではなく繰り返しです。 –

関連する問題