簡體   English   中英

從 Observable 集合中刪除

[英]Deleting from an Observable collection

我有一個可觀察的集合,我想從中刪除一個特定的實例項。

例如

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

但是,這很好用,因為這與從 treeview 中刪除子元素有關,我想根據單擊的 treeview 的級別動態創建上述語句。 所以我可以想要:

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

或者

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

我知道我存儲在列表中的父項的 ID,例如

0 1 01,0

我的問題是,當我不知道列表集合中有多少項目時,我該如何創建上述語句?

謝謝。

有時老學校做得最好。

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

那么如果你確實想要一些聰明的東西,你可以把它們變成擴展方法。

我會使用遞歸函數,它可以為您提供實際/當前節點,您可以找到綁定的 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);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM