c# - 复制一个 ObservableCollection 项

标签 c# wpf observablecollection

我想在 observablecollection 中复制一个列表项。当我这样做时:

            TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition];

它创建了特定列表项的副本,但随后它们在我的 UI 中进行了链接。因此,如果我更改新的重复项的名称,它会更改原始名称。我知道我可以一个一个地设置每个属性(见下文)但是有没有办法只复制整个项目?

    TreasureCards[TreasureCards.Count - 1].Name = TreasurecCards[CardPosition].Name;
    TreasureCards[TreasureCards.Count - 1].Type= TreasurecCards[CardPosition].Type;

// etc

最佳答案

您没有复制对象。您正在创建对该对象的新引用。仍然只有一个对象;现在您的集合中有两个对它的引用,并且对对象的任何更改都会反射(reflect)在两个引用中。

要创建新对象,您可以对从 Object 派生的任何对象调用 MemberwiseClone()。此方法返回一个新实例,复制原始对象中所有字段的值。所以你会这样做:

TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition].MemberwiseClone();

此方法有两个限制。首先,它是一个浅拷贝,即原始对象中的任何引用字段都复制了它们的值。因此,如果 a.Foo 是对 Bar 对象的引用,则 a.MemberwiseClone().Foo 将引用相同的 Bar 对象。其次,该方法只是复制字段;它不调用新对象的构造函数。根据类的设计,这要么不重要,要么非常重要。

通常,让类实现ICloneable 并显式实现Clone() 方法会更安全,例如:

public TreasureCard Clone()
{
   return new TreasureCard
   {
      Name = this.Name,
      Type = this.Type,
      ...
   };
}

关于c# - 复制一个 ObservableCollection 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5408594/

相关文章:

c# - 修改后的请求路径上的 HttpContext GetEndpoint .net 5

c# - 使用正则表达式将插值字符串转换为 string.Format

c# - ASP .NET MVC 区域注册

.net - 如何将图片从资源管理器拖放到 WPF 控件上?

data-binding - Silverlight 列表框 : Binding does not get updated

c# - 有没有办法将可观察集合转换为常规集合?

c# - ObservableCollection 和线程

c# - MySQL 和 C#.Net 存储过程和多参数

c# - 如何仅使用单个 Alt 修饰符检测按键

c# - 纯在 XAML 中定义绑定(bind)时,源变量是否可以在后面的代码中访问?