Việc triển khai ví dụ IEditableObject
trên MSDN (here) hiển thị một cách khá đơn giản để thực hiện. Tôi nghĩ rằng điều này thực hiện là rõ ràng hơn một chút, nhưng mặt khác của Microsoft có lẽ là thử nghiệm của họ:
public class MyObject : ViewModelBase, IEditableObject
{
private struct MyData
{
string Foo,
string Bar
};
private MyData Saved = new MyData()
private MyData Current = Saved;
public string Foo
{
get { return Current.Foo; }
set
{
Current.Foo = value;
OnPropertyChanged("Foo");
}
}
public string Bar
{
get { return Current.Bar; }
set
{
Current.Bar = value;
OnPropertyChanged("Bar");
}
}
public void BeginEdit()
{
if (Current == Saved)
{
Current = new MyData();
Current.Foo = Saved.Foo;
Current.Bar = Saved.Bar;
}
}
public void CancelEdit()
{
if (Current != Saved)
{
Current = Saved;
OnPropertyChanged("Foo");
OnPropertyChanged("Bar");
}
}
public void EndEdit()
{
if (Current != Saved)
{
Saved = Current;
}
}
}
Sử dụng mô hình này, Current
luôn chứa các giá trị hiện tại của đối tượng không phụ thuộc vào trạng thái chỉnh sửa nó, mà làm cho accessors tài sản dễ để thực hiện; các phương thức IEditableObject
chỉ cần chuyển xung quanh những gì Current
là.
Thật dễ dàng để thực hiện ngay cả một số lượng tài sản khá lớn; bạn chỉ cần chắc chắn cập nhật BeginEdit
và CancelEdit
khi bạn thêm thuộc tính mới.
Nguồn
2010-02-17 20:27:06