C# 避免在第二个集合中更改NotifyPropertyChanged
我有一个类C# 避免在第二个集合中更改NotifyPropertyChanged,c#,wpf,xaml,C#,Wpf,Xaml,我有一个类BaseClass(ObservableCollection1)的可观察集合,它实现了INotifyPropertyChanged,当某些内容发生更改时,属性会引发事件。我想将调用数据库时获得的默认值存储在另一个可观察的集合(observedcollection2)中。我的视图绑定到ObervableCollection1而不是2,但如果BaseClass中发生更改,则由于BaseClass上的inotifPropertyChanged,因此会在1和2中更新值,如何避免第二个Obser
BaseClass
(ObservableCollection1
)的可观察集合,它实现了INotifyPropertyChanged
,当某些内容发生更改时,属性会引发事件。我想将调用数据库时获得的默认值存储在另一个可观察的集合(observedcollection2
)中。我的视图绑定到ObervableCollection1
而不是2,但如果BaseClass
中发生更改,则由于BaseClass
上的inotifPropertyChanged
,因此会在1和2中更新值,如何避免第二个ObservableCollection2
被更新为新值?深度复制是关键,您所要做的就是让基类实现IClonable接口,然后添加复制对象所需的所有逻辑。可以使用二进制序列化深度复制对象
因此,首先,您的类必须标记为[Serializable],才能正常工作
[Serializable]
public class BaseClass: ICloneable
{
/*
Base Class Mumbers ...
*/
public object Clone()
{
var bf = new BinaryFormatter();
using (Stream str = new MemoryStream())
{
bf.Serialize(str, this);
str.Seek(0, SeekOrigin.Begin);
return bf.Deserialize(str);
}
}
}
最后复制你的源代码集
var copiedCollection = new ObservableCollection<BaseClass>(sourceCollection.Select(a => (BaseClass)a.Clone()));
var copiedCollection=newobservedcollection(sourceCollection.Select(a=>(BaseClass)a.Clone());
或者不要为第二个集合扩展基类
。。。或者只需使用列表
。。。为什么它必须是一个可观察的集合
?或者在ItemsSource绑定上使用Mode=OneTime。根据您的需要,您可以按照Scroog1的建议执行,或者您可能必须执行集合的深度副本而不是浅层副本…也就是说,克隆集合中的所有元素,以便它们是BaseClass.Er的不同实例,重新阅读你的措辞有点混乱的问题,我得到的印象是你误解了你的问题,而Scroog1的建议不会起作用。无论INotifyPropertyChanged如何,值都将在2中更新,因为两者中的对象都是相同的实例。你必须做一个深度复制。谢谢..效果很好:)