Blazor WASM:List.Remove()调用似乎正在删除对对象的所有引用



我有一个应用程序,它包含像这样的对象

Item
- Guid Uid
- String Title
- Item Parent
Group : Item
- List<Item> Items
Interface : Item
Field : Group

我使用HTML5拖放API允许用户将组和接口拖动到其他组或从其他组拖动接口。

为了移动,我将Payload(拖动的对象(添加到新对象中,然后将其从其父对象的项目列表中删除。

public void HandleOnDrop(){
if(Payload.Uid != this.Uid){
Console.WriteLine("Adding item " + Payload.Uid + " to " + this.Uid);
Console.WriteLine("Removing item " + Payload.Uid + " from " + Payload.Parent.Uid);
Items.Add(Payload);
Payload.Parent.Items.Remove(Payload.Parent.Items.Find(x => x.Uid == Payload.Uid));
}
CssClass = "";
Field.Refresh();
Payload.Parent = this;
}

我发现Payload.PParent.Items.Remove((调用会导致对象的实例被释放。如果我把它注释掉,拖动功能可以很好地工作,只是它不会将对象从其原始位置移除。如果我将Interface元素添加到多个组中,然后删除该Interface,则会删除所有引用以及原始对象。

我甚至用一个简单的Console.WriteLine在Item基类中实现了IDisposable,这样我就可以看到正在处理的对象。我预计,由于他们被添加到另一个名单中,他们不会被处理。如果另一个对象需要它们,为什么要这样做?

这是预期的行为吗?我是不是遗漏了什么?

解决方案是在组件实例化中使用@key。

https://github.com/dotnet/aspnetcore/issues/15846

最新更新