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]才能序列化

  • 相关阅读:
    Kafka学习笔记(五、Kafka偏移量)
    web-备份是个好习惯
    web-Web5
    web-web4
    web-flag就在index里
    C++日期类、时间类、日期时间类的设计
    蒙提霍尔问题简单粗暴的理解掉
    sql分组操作符与聚集函数
    sql增删改
    sql简单查询
  • 原文地址:https://www.cnblogs.com/ives/p/14227687.html
Copyright © 2011-2022 走看看