c# - 使用序列化检查对象的状态变化?

标签 c# .net

我有一个绑定(bind)到对象的表单,当用户试图离开表单时,如果表单上的任何内容已更改,我想警告他们,并提示他们保存。我的问题是,有没有办法在不为绑定(bind)对象中的所有类实现 IComparar 的情况下实现这一目标?我在想是否有一种方法可以在加载表单时序列化我的对象,并与也被序列化的更改对象进行简单比较。类似于字符串比较。

希望这是有道理的,

谢谢

最佳答案

如果您遵循人们在实现 INotifyPropertyChanged 时使用的常规模式,那么只需要另外几行代码即可实现 IsDirty(或 IsChanged ) 数据对象上的标志。

首先,创建一个实现基础的基类,以及一个派生自它的真实数据类:

public class BaseDataObject : INotifyPropertyChanged
{

    public bool IsDirty
    {
        get { return _isDirty; }
        protected set { _isDirty = value; }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        _isDirty = true;

        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    private bool _isDirty;
}


public class MyRealDataObject : BaseDataObject
{
    public int MyIntProperty
    {
        get { return _myIntProperty; }
        set
        {
            bool changed = _myIntProperty != value;
            if (changed)
            {
                _myIntProperty = value;
                OnPropertyChanged("MyIntProperty");
            }
        }
    }

    private int _myIntProperty;
}

现在,只要通知属性发生变化,数据对象的 IsDirty 标志就会设置为 true。要检查更改,您所要做的就是枚举您的对象集合并检查 IsDirty 标志。如果您很聪明,可以使用 LINQ 语句来完成:

bool changesMade = MyDataObjectCollection.Any(p => p.IsDirty == true).Count() > 0; 

... or ....

bool changesMade = MyDataObjectCollection.Count(p => p.IsDirty == true) > 0;

如果您的数据对象不在一个很好的集合中,您只需要手动迭代它们。当然,上面的模式可以用几种不同的方式重构(嘿,也许你甚至没有使用 INotifyPropertyChanged 因为你没有将数据绑定(bind)到 UI 元素),但它为你提供了一个很好的开始示例,说明如何着手实现什么你想要的。

关于c# - 使用序列化检查对象的状态变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2466277/

相关文章:

c# - 无法将嵌套关系或元素列添加到包含 SimpleContent 列的表

.net - 多个小组件和一个大组件哪个更好?

c# - 建立一个安全库,我想我过度 build 了

.net - 无法从Docker托管的Web应用程序调用外部api

asp.net - 从 ASP.NET Dev Server 移动到 IIS 后出现 "An attempt to attach an auto-named database for file *FileName* failed."错误

c# - 如何从指定级别获取 json 节点?

c# - MVC Controller 的 AJAX 参数不是 NULL?

c# - 将 LINQ to SQL 与每个原子操作一个 DataContext 结合使用时出现问题

c# - 需要一个关于 asp.net MVC 2 领域的好教程

PowerShell 5 中从未处理过的 C# 事件