我一直在寻找实现通用类以实现IEditableObject的一些ViewModel,以便支持取消对该ViewModel中属性的编辑。这主要用于WPF中带有OK和Cancel按钮的模态对话框。
我在网上找到了以下实现:
- 通过TypeDescriptor和Reflection实现IEditableObject的通用实现 - Paul Stovell:适用于WPF和Windows Forms的IEditableObject适配器 这对我来说似乎过于复杂,但我不确定是否错过了它们提供的某些功能。首先,它们不支持深层复制,因此在我的世界中,我们可以使用MemberwiseClone执行浅层复制。例如:
我在网上找到了以下实现:
- 通过TypeDescriptor和Reflection实现IEditableObject的通用实现 - Paul Stovell:适用于WPF和Windows Forms的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继承使用,但你明白我的意思...
这里有什么区别?除了不支持深拷贝之外,我的方法有哪些缺点?如果要修改以支持深拷贝(我还不确定是否必要),你会如何修改它?
更新:
发现这篇文章展示了比我更好的实现,使用了反射。仍然比我链接到的另外两篇文章简单得多:
我们如何扩展它以支持深拷贝?