Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 避免在第二个集合中更改NotifyPropertyChanged_C#_Wpf_Xaml - Fatal编程技术网

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中更新,因为两者中的对象都是相同的实例。你必须做一个深度复制。谢谢..效果很好:)