从Observable集合中删除
本文关键字:删除 集合 Observable | 更新日期: 2023-09-27 18:05:30
我有一个可观察集合,我想从中删除一个特定的实例项。
。
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
我的问题是,当我不知道列表集合中究竟有多少项时,我该如何创建上述语句?
谢谢。
有时候老派的方法最好。
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]);
}
}
如果你想要一些聪明的东西,你可以把它们变成扩展方法
我会使用递归函数,它可以给你实际/当前节点,你可以找到绑定的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);
}
}