为什么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中的相同值。我不知道我做错了什么,因为第二行代码应该是一个复制构造函数?
没有什么比源代码更能说明问题了。你在做无效的假设。
即:
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());