gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:28 25 4
gpt4 key购买 nike

我有一个绑定(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com