从Observable集合中删除

问题描述:

我有一个可观察的集合,我想从中删除特定的实例项目。从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 01,0

我的问题是我怎么去创造的时候我不知道到底有多少项目存在将要在列表中收集上述说法?

谢谢。

+1

问题的标题有点误导。您可能正在使用ObservableCollection,但问题与ObservableCollection无关。无论是用ObservableCollection还是数组或列表实现,任何递归数据结构的问题都是一样的。 – Davy8

我会使用递归函数,它可以给你实际/当前节点,你可以找出绑定ObservableCollection并从中删除。

+0

我已经有一个递归函数,它可以找到父ID和选定的项目,我只是不知道如何生成声明来从集合中实际删除项目。 –

+0

鉴于你的集合结构是相同的(即父母总是有孩子“节点”的集合,你可以不使用相同的递归函数来给你ObservableCollection,你想? –

事情是这样的:

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

有时候老同学做它最好的。

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])); 
    } 

的情况下,你没有“根” YourClass实例(我怀疑你做,但以防万一)地址: -

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

我喜欢迭代版本,而不是递归,个人。 –