2011-11-09 18 views
6

Tôi có một Cửa sổ phục vụ như một hộp thoại trong một ứng dụng WPF. Hộp thoại này có nút "OK" và nút "Hủy". Tôi đang thiết lập DataContext của Window thành một thể hiện của một đối tượng trong ứng dụng của tôi. Người dùng có thể thay đổi các giá trị của các thuộc tính của đối tượng trong Window. Nếu người dùng nhấp vào "Hủy", tôi muốn hoàn nguyên giá trị thuộc tính về giá trị ban đầu của họ. Có một cách dễ dàng để làm điều này trong WPF?Hoàn nguyên một đối tượng là người dùng nhấp vào "Hủy" trong WPF

Ví dụ: tôi biết với dịch vụ dữ liệu RIA có RejectChanges. Có điều gì đó tương tự ở phía máy khách với WPF không?

Cảm ơn!

Trả lời

2

Trong đối tượng mà được thiết lập để DataContext (lý tưởng nó phải được ViewModel trong cách tiếp cận MVVM) tiếp xúc với hai lệnh

public ICommand CancelCommand { get; set; } 
public ICommand OkCommand { get; set; } 

Sau đó cho các nút gán các lệnh này như hình dưới đây

<Button Command="{Binding CancelCommand}" ... /> 

Bạn' để giữ hai bản sao của đối tượng, một bản sao phải được tạo bởi Deep Copy hoặc nếu một đối tượng có một vài trường có thể chỉnh sửa, bạn có thể giữ chúng thành trường lớp. Về cơ bản trên giai đoạn khởi tạo làm các thuộc tính đối tượng có thể chỉnh sửa dự phòng, sau đó liên kết với DataContext phiên bản có thể chỉnh sửa của đối tượng. Trong Trình quản lý Lệnh Hủy - khôi phục từ bản sao lưu ...

+2

Và .NET định nghĩa giao diện 'IEditableObject' cho chính xác mục đích này. Khi hộp thoại mở ra, bạn sẽ gọi là 'BeginEdit'. Khi nó được đóng, bạn gọi hoặc là 'EndEdit' hoặc' CancelEdit' tùy thuộc vào nút nào được bấm. –

+0

Có, bạn có thể duy trì trạng thái cũ của đối tượng bắt đầu hơn là nếu đúng hơn so với áp dụng hoặc endedit và nếu từ chối thay đổi bởi CacelEdit –

+0

@Kent Boogaart: Xin chào Kent! Cảm ơn bạn đã chỉ ra điều này. Có lợi ích gì khi sử dụng giao diện tích hợp này không? Hoặc chỉ theo cách tiếp cận tiêu chuẩn? Ngoài ra, từ MVVM quan điểm làm thế nào nó có thể được sử dụng để buộc nút bấm với logic khôi phục trạng thái? – sll

1

Khi đối tượng đơn giản (chỉ một vài thuộc tính cơ bản như chuỗi, int, v.v.) DeepCopy hoặc IEditableObject là một tùy chọn rất tốt.

Khi đối tượng là một nút trong một hệ thống phân cấp phức tạp hơn, điều này có thể chứng minh là quá khó và quay lại máy chủ/mô hình và tải lại dữ liệu ban đầu dễ dàng hơn nhiều.

+0

Tôi tin rằng Deep Copy (hoặc serialization vie hoặc phản ánh) có thể xử lý bất kỳ Node comple, tôi có sai không? Tôi tin rằng cuộc gọi máy chủ là tốn kém nhiều anyway, bởi vì bạn đã có một đối tượng trong bộ nhớ để làm với nó những gì bạn muốn và nó woudl được (tôi tin) ít tốn kém hơn là yêu cầu mạng/phản ứng – sll

+0

'IEditableObject' không quy định cách bạn đi về việc triển khai hành vi chỉnh sửa/cam kết/rollback. Nó có thể là bạn đang tuần tự hóa/deserializing đằng sau hậu trường, hoặc bạn chỉ cần sao chép các lĩnh vực về, hoặc bạn đang trở lại máy chủ/cơ sở dữ liệu để làm mới các đối tượng dữ liệu. Một hệ thống phân cấp phức tạp không ngăn cản bạn thực hiện 'IEditableObject'. –

+0

Tôi không gợi ý rằng điều đó là không thể, tôi chỉ gợi ý rằng nó có thể trở nên khá khó khăn tùy thuộc vào độ phức tạp của cây đối tượng. Và có, DeepCopy là một cách để thực hiện IEditableObject –

Các vấn đề liên quan