为什么list中的值< >当ObservableCollection中的副本发生变化时

本文关键字:副本 变化 ObservableCollection list 为什么 | 更新日期: 2023-09-27 18:05:38

// Get list from DB    
List<Category> dbCategories = DatabaseWrapper.GetCategories();
...
// COPY values to Obs.Col.
var shownCategries = new ObservableCollection<Category>(dbCategories);
// This also changes the value in 'dbCatagories'.
shownCategories[0].Name = "Hej";

我希望能够更改obs.col中的值。无需更改dbCategories中的相同值。我不知道我做错了什么,因为第二行代码应该是一个复制构造函数?

为什么list中的值< >当ObservableCollection中的副本发生变化时

没有什么比源代码更能说明问题了。你在做无效的假设。

即:

private void CopyFrom(IEnumerable<T> collection)
{
  IList<T> items = this.Items;
  if (collection == null || items == null)
    return;
  foreach (T obj in collection)
    items.Add(obj);
}

public ObservableCollection(List<T> list)
  : base(list != null ? (IList<T>) new List<T>(list.Count) : (IList<T>) list)
{
  this.CopyFrom((IEnumerable<T>) list);
}

可以看到,"复制构造函数"确实复制了LIST对象本身,但是它不复制单个列表元素。注意,这不是那么简单,如果Category是struct,您的示例实际上可以工作。

这是通常的行为,它被称为浅复制。或者,您正在寻找的称为深度复制

您需要手动创建副本,要么使用序列化,要么在Category类中创建复制构造函数。

这是一个很好的例子:

new ObservableCollection(dbCategories.Select(x => new Category(x)).ToList());