zoukankan      html  css  js  c++  java
  • WPF通过深拷贝实现保存与取消

    用old保存就设置,用new保存新设置
    确认逻辑

      public void SaveCurrent()
            {
                //创建一个新对象(深拷贝)
                oldConfig = CopyEx.DeepCopyByBin(config);
            }
    
    

    取消逻辑

    
            public void Undo()
            {
                config = CopyEx.DeepCopyByBin(oldConfig);
            }
    

    因为对象绑定给了控件,浅拷贝或用json序列化的方式会丢失一些私有对象导致再次进入页面控件出现丢失数据的现象

    拷贝的代码如下

    public static class CopyEx
        {
            public static T DeepCopyByBin<T>( T obj)
            {
                object retval;
                using (MemoryStream ms = new MemoryStream())
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    //序列化成流
                    bf.Serialize(ms, obj);
                    ms.Seek(0, SeekOrigin.Begin);
                    //反序列化成对象
                    retval = bf.Deserialize(ms);
                    ms.Close();
                }
                return (T)retval;
            }
        }
    

    注意

    在绑定数据的时候使用了

            public event PropertyChangedEventHandler PropertyChanged;
    

    此时进行序列化会报错

    需要给事件增加 [field:NonSerialized]

     public class BindEx : INotifyPropertyChanged
        {
            [field:NonSerialized]
            public event PropertyChangedEventHandler PropertyChanged;
    
    
            protected internal virtual void OnPropertyChanged(string propertyName)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    

    此外需要注意对象需要添加 [Serializable]才能序列化

  • 相关阅读:
    截取文件路径组成新文件路径
    jsoup选择器
    正则小示例
    一个没有经过优化的过滤指定目录下的指定扩展名文件的算法
    正则表达式生成问题
    链接中带换行的页面查找替换问题
    数组扩容测试
    LeetCode 3.无重复字符的最长子串
    LeetCode 200.岛屿数量
    LeetCode 560.和为K的子数组
  • 原文地址:https://www.cnblogs.com/ives/p/14227687.html
Copyright © 2011-2022 走看看