复制 ObservableCollection 项

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)

Rob*_*ney 5

你不是在复制对象。您正在创建对对象的新引用。仍然只有一个对象;现在在您的集合中有两个对它的引用,并且对对象的任何更改都反映在这两个引用中。

要创建新对象,您可以调用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)