Sta*_*cey 1 c# wpf observablecollection
我想在 observablecollection 中复制一个列表项。当我做:
TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition];
Run Code Online (Sandbox Code Playgroud)
它创建了特定列表项的副本,但随后它们在我的 UI 中链接。因此,如果我更改新重复项的名称,它会更改原始名称。我知道我可以一个一个地完成每个属性(见下文),但有没有办法只复制整个项目?
TreasureCards[TreasureCards.Count - 1].Name = TreasurecCards[CardPosition].Name;
TreasureCards[TreasureCards.Count - 1].Type= TreasurecCards[CardPosition].Type;
// etc
Run Code Online (Sandbox Code Playgroud)
你不是在复制对象。您正在创建对对象的新引用。仍然只有一个对象;现在在您的集合中有两个对它的引用,并且对对象的任何更改都反映在这两个引用中。
要创建新对象,您可以调用MemberwiseClone()从Object. 此方法返回一个新实例,复制原始对象中所有字段的值。所以你会这样做:
TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition].MemberwiseClone();
Run Code Online (Sandbox Code Playgroud)
这种方法有两个限制。首先,它是一个浅拷贝,即原始对象中的任何引用字段都复制了它们的值。所以如果a.Foo是对一个Bar对象的引用,a.MemberwiseClone().Foo就会引用同一个Bar对象。其次,该方法只是复制字段;它不会调用新对象的构造函数。根据类的设计,这要么不重要,要么非常重要。
通常,让类实现ICloneable并显式实现Clone()方法更安全,例如:
public TreasureCard Clone()
{
return new TreasureCard
{
Name = this.Name,
Type = this.Type,
...
};
}
Run Code Online (Sandbox Code Playgroud)