调用ObservableCollection.Add影响另一无关ObservableCollection问题问询
问题原因解析
这是C#中引用类型的特性导致的,具体可以拆解为两点说明:
ObservableCollection<T>属于引用类型,你定义的两个私有字段_collection和_editCollection存储的不是集合对象本身,而是堆内存中集合实例的内存地址指针。- 两个属性的setter逻辑不同,直接决定了两个字段的指向关系:
- 当你给
Collection属性赋值时,它的setter会把传入的实例地址同时赋值给_collection和_editCollection,此时两个字段指向堆内存中的同一个集合实例。你调用EditCollection.Add()方法时,是直接修改这个共同指向的实例的内部数据,所以通过_collection访问到的实例内容也会同步变化,这就是_collection.Count自动增加的原因。 - 当你直接给
EditCollection属性赋值新的ObservableCollection实例时,它的setter只会修改_editCollection本身的指向,将其关联到新的实例地址,并不会修改_collection的指向。此时两个字段已经指向完全独立的两个集合实例,后续对EditCollection的任何修改都不会影响到_collection。
- 当你给
如果需要避免两个集合修改互相影响,你可以修改Collection的setter逻辑,赋值时生成新的集合副本,示例如下:
public ObservableCollection<string> Collection { get { return _collection; } set { _collection = value; // 生成新的集合副本,两个字段指向不同实例 _editCollection = new ObservableCollection<string>(value); OnPropertyChanged("Collection"); OnPropertyChanged("EditCollection"); } }
内容的提问来源于stack exchange,提问作者Imightbehigh
相关产品推荐
相关产品推荐

