我们处理这个问题的方式需要更多的前期工作,但可以使用 VS 宏或 CodeSmith 等代码生成工具来自动化。
但是,这种方法可以扩展到集合绑定到的任何 UI 构造,并且每次您需要知道是否有更改时都不必在 UI 中重新实现。
这个概念是更新集合和业务对象中的标志,以确定集合成员是否已更改或集合中的任何给定记录是否已更改。
实现相当简单:
向业务对象类添加 HasChanged 属性。
将 AnyDeleted 属性添加到集合中。仅当从集合中删除项目时才会设置此设置。
在从数据库中读取记录后,将这些值初始化为 false。
(现在是半乏味的部分)对于类中的每个属性,如果值实际更改,则将 HasChanged 属性设置为 true。注意空值。例如:
public bool IsSelected
{
get
{
return m_fIsSelected;
}
set
{
if (m_fIsSelected != value)
{
this.HasChanged = true;
m_fIsSelected = value;
}
}
}
修改集合以在删除记录时将 AnyDeleted 属性设置为 true:
protected override void RemoveItem(int index)
{
this.AnyDeleted = true;
base.RemoveItem(index);
}
最后,向集合中添加一个方法来指示是否有任何更改。这是您将调用以确定是否需要保存任何更改的方法:
public bool HasAnyChanges()
{
// Exceptions are handled by the caller
// If anything was deleted, return true
if (this.AnyDeleted)
{
return true;
}
else
{
foreach (T theItem in this)
{
if (theItem.HasAnyChanges())
{
return true;
}
}
}
return false;
}