Ví dụ ban đầu của đối tượng NewsServer
của bạn không thay đổi vì bạn chưa thực sự sửa đổi nó. Sau khi xây dựng của bạn được gọi là bạn có ba NewsServer
tài liệu tham khảo sau đây:
newsServer = original instance
_newsServer = original instance
DataContext = clone of original instance
Sau khi nút OK được nhấp tài liệu tham khảo sẽ như sau:
newsServer = original instance
_newsServer = clone of original instance (possibly modified)
DataContext = clone of original instance (possibly modified)
Hãy nhớ rằng đối tượng là các loại tài liệu tham khảo, bài tập của bạn đến _newsServer
bạn chỉ cập nhật tham chiếu của nó chứ không phải giá trị của đối tượng.
Để cho phép tự cập nhật đối tượng NewsServer
, có hai tùy chọn cho bạn biết, các tùy chọn khác có thể tồn tại, tùy chọn đầu tiên có lẽ là đơn giản nhất.
- Thực hiện một phương pháp
void Update(NewsServer source)
trên đối tượng NewsServer
của bạn sau đó thay vì thực hiện nhiệm vụ mới đến lĩnh vực _newsServer
thay vì gọi phương thức cập nhật vào nó và vượt qua trong các giá trị DataContext
tham khảo.
- Hiển thị giá trị
_newsServer
với thuộc tính công khai/nội bộ. Bạn có thể tận dụng điều này thông qua một loạt các cơ chế: trả lời rõ ràng cho một sự kiện được nâng lên khi giá trị thuộc tính thay đổi; liên kết với thuộc tính (ví dụ: biến thuộc tính phụ thuộc hoặc triển khai INotifyPropertyChanged
); hoặc chỉ mong đợi người gọi truy lục giá trị nếu và khi phương thức ShowDialog()
trả về với giá trị là true
.
Lưu ý rằng nếu bạn đẩy một chút logic trở lại người gọi, lớp hộp thoại của bạn có thể đơn giản hơn. Cụ thể, một cách tiếp cận là chỉ chỉ duy trì đối tượng được nhân bản, được hiển thị với người gọi qua thuộc tính (ví dụ: loại bỏ trường _newsServer
hoàn toàn và chỉ sử dụng DataContext
). Đối tượng này sẽ bị ràng buộc với các phần tử của hộp thoại như trước đây. Người gọi sẽ chỉ truy xuất tham chiếu của cá thể này trên kết quả true
từ phương thức ShowDialog()
.
Ví dụ:
NewsServer newsServer = ...;
EditServerDialog editServerDialog = new EditServerDialog(newsServer);
if (editServerDialog.ShowDialog() == true)
{
newsServer = editServerDialog.DataContext;
}
Đối tượng nhân bản sẽ chỉ đơn giản là bỏ qua bởi người gọi nếu hộp thoại bị hủy bỏ, và do đó các phương pháp ShowDialog()
trả false
. Bạn chỉ có thể sử dụng lại thuộc tính DataContext
như được hiển thị ở trên hoặc bạn có thể tạo thuộc tính khác (ví dụ: NewsServer
), chỉ trả về giá trị thuộc tính DataContext
(tức là làm cho mã rõ ràng hơn đối với giao diện công khai của lớp hộp thoại).
Nguồn
2010-04-01 17:42:29
Điều này có thể hữu ích nếu bạn hiển thị thiết lập ràng buộc. –
Ví dụ về ràng buộc: {Ràng buộc NeedAuthentication, UpdateSourceTrigger = LostFocus, Mode = TwoWay}. Ràng buộc là chính xác vì this.DataContext chứa dữ liệu chính xác. – ErikTJ