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

  • 相关阅读:
    C# 监测每个方法的执行次数和占用时间(测试1)
    C# 依赖注入那些事儿
    SQL Server GROUP BY 后 拼接 字符串
    C# 根据Excel生成树
    C# 反射赋值
    C# 集合转换为DataTable
    Oracle 未能加载文件或程序集Oracle.DataAccess
    MySQL 各种主流 SQLServer 迁移到 MySQL 工具对比
    平衡树
    数据结构优化dp
  • 原文地址:https://www.cnblogs.com/ives/p/14227687.html
Copyright © 2011-2022 走看看