【问题标题】:WPF Binding & MemberwiseClone ProblemsWPF 绑定和 MemberwiseClone 问题
【发布时间】:2012-05-04 18:12:42
【问题描述】:

我正在处理一个 WPF 项目,并且已经实现了一种非常简单的方法来撤消一个级别的更改,这种方法在整个项目中都能很好地工作,除了对象属性的更改反映在 MemberwiseClone 中的一种情况。

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

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

有没有办法解决这个问题?欢迎您对此提出任何想法。

谢谢。

【问题讨论】:

    标签: wpf binding clone observablecollection


    【解决方案1】:

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

    你需要一份深拷贝,而不是浅拷贝。看看How do you do a deep copy an object in .Net (C# specifically)?

    【讨论】:

    • 我正在使用链接中的扩展方法,但是我得到以下异常:在程序集'WindowsBase,版本 = 4.0.0.0,文化 = 中性,PublicKeyToken 中键入'System.ComponentModel.PropertyChangedEventManager' =31bf3856ad364e35' 未标记为可序列化。有什么想法吗?我已将我所有的类都标记为可序列化。
    • 你必须在你的类上使用 ObservableCollection 的 [Serializable] 属性。有关示例,请参见 Basic Serialization
    • LPL,是的,我已将我的所有类都标记为可序列化,但需要 NonSerializedAttribute 才能完成这项工作。非常感谢您提供的链接和非常有帮助的答案。
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多