我一直在寻求实现一个通用类,该类实现 IEditableObject 以便我的一些 ViewModel 继承,以便支持取消对该 ViewModel 中的属性的编辑。它的主要用途是用于 WPF 中具有“确定”和“取消”按钮的模式对话框。
我在网上找到了以下实现:
- 通过 TypeDescriptor 和 Reflection 实现 IEditableObject 的通用实现
- Paul Stovell:用于 WPF 和 Windows 窗体的 IEditableObject 适配器
这对我来说似乎过于复杂,但我不确定我是否缺少它们提供的一些功能。一方面,他们不支持深拷贝,所以在我的世界里,我们可以只使用 MemberwiseClone 来执行浅拷贝。就像是:
private Item backupCopy;
private bool inEdit;
public void BeginEdit()
{
if (inEdit) return;
inEdit = true;
backupCopy = this.MemberwiseClone() as Item;
}
public void CancelEdit()
{
if (!inEdit) return;
inEdit = false;
this.Name = backupCopy.Name;
}
public void EndEdit()
{
if (!inEdit) return;
inEdit = false;
backupCopy = null;
}
这个例子当然应该在 ViewModel 继承的通用抽象基类中,但你明白了......
这里有什么区别?除了不支持深拷贝之外,我的方法还有哪些缺点?您将如何修改它以支持深拷贝(不确定是否有必要)?
更新:
发现这篇文章显示了比我使用反射更好的实现。仍然比我链接到的其他两篇文章简单得多:
我们如何扩展它以支持深拷贝?