2010-02-17 7 views
5

Tôi có một dự án Silverlight 3. Tôi có một hộp văn bản đó là dữ liệu TwoWay ràng buộc với một đối tượng. Nếu người dùng muốn hủy các thay đổi mà họ đã thực hiện cho hộp văn bản, cách tốt nhất để hoàn tác các thay đổi đối với trường bị ràng buộc trên đối tượng là gì?Cách quay lại các thay đổi được thực hiện cho một đối tượng trong silverlight 3 với liên kết TwoWay

Tôi biết tôi có thể lưu trữ giá trị ban đầu trong biến separte khi đối tượng được tải, nhưng tôi đã tự hỏi nếu có cách nào tốt hơn để làm điều này?

Cảm ơn.

Trả lời

0

Nếu bạn muốn quay trở lại khi giá trị được đặt, sau đó ném một ngoại lệ trong trình thiết lập thuộc tính. Nếu bạn cần thực hiện khôi phục khi gửi, bạn nên lưu trữ các cài đặt trong một lớp riêng biệt và cung cấp cài đặt nguyên tử và khôi phục - đảm bảo rằng mỗi thuộc tính của bạn đều hỗ trợ INotifyPropertyChanged.

5

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 BeginEditCancelEdit khi bạn thêm thuộc tính mới.