从Observable集合中删除

时间:2011-08-12 15:07:13

标签: c# silverlight

我有一个可观察的集合,我想从中删除特定的实例项。

e.g。

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

我的问题是,当我不确切地知道列表集合中会有多少项目时,我该如何创建上述语句?

感谢。

3 个答案:

答案 0 :(得分:1)

有时老派最好。

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

如果您没有“Root”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]);
    }
}

然后,如果你想要一些聪明的东西,你可以把它们变成扩展方法。

答案 1 :(得分:0)

我会使用Recursive函数,它可以为您提供Actual / Current节点,您可以找到绑定的ObservableCollection并从中删除。

答案 2 :(得分: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);
        }
    }