2012-05-04 78 views
0

我正在开发一个WPF项目,并实现了一个非常简单的方法来撤消在整个项目中很好地工作的更改级别,除了一个对象属性更改反映在MemberwiseClone中的情况。WPF Binding&MemberwiseClone问题

我正在做的是在对象中添加或编辑属性之前在对象中执行MemberwiseClone,然后如果用户想撤消,我将MemberwiseClone对象的每个属性复制回当前对象。

因为我正在使用WPF绑定,所以使用MemberwiseClone对我很有吸引力,因为直到现在,对属性所做的任何更改都未反映在MemberwiseClone中。这一次,我的对象中有一个属性,它是另一个对象的ObservableCollection,发生的情况是,如果将项目添加到ObservableCollection中,它也会添加到MemberwiseClone创建的对象中,我永远无法真正撤消它。

有没有办法解决这个问题?你可能对此有任何想法都欢迎。

谢谢。

回答

1

根据Object.MemberwiseClone Remarks您的ObservableCollection中的对象引用将被复制,但不会被引用的对象本身。因此,撤销集合引用了相同的可能更改的对象。

您需要深层复制,而不是浅层复制。看看How do you do a deep copy an object in .Net (C# specifically)?

+0

我正在使用链接中的扩展方法,但是我得到以下异常:在程序集'WindowsBase,Version = 4.0.0.0,Culture = neutral,PublicKeyToken中键入'System.ComponentModel.PropertyChangedEventManager' = 31bf3856ad364e35'未标记为可序列化。 有什么想法?我已将所有类标记为Serializable。 – MikeMalter

+0

您必须使用ObservableCollection在您的类上使用[Serializable]属性。有关示例,请参见[基本序列化](http://msdn.microsoft.com/zh-cn/library/4abbf6k0%28v=vs.100%29.aspx)。 – LPL

+0

也看看[这篇文章](http://stackoverflow.com/a/8879533/620360)。 – LPL