2010-10-25 24 views
8

Tôi đang sử dụng các bộ sưu tập quan sát được xung quanh các ứng dụng của mình. Vấn đề của tôi là khi tôi sử dụng một cửa sổ bật lên để chỉnh sửa các thực thể đó, danh sách bị ràng buộc của tôi sẽ bị thay đổi khi người dùng thay đổi các trường tương ứng đó trong cửa sổ.WPF ObservableCollection Edit Mode

Làm cách nào tôi có thể chỉ đóng băng các thay đổi quan sát cũng như chỉ phát hành chúng khi thực thể được lưu?

Cảm ơn, Oran

+0

Vui lòng kiểm tra http://stackoverflow.com/questions/2105830/editing-observablecollections-selecteditem- không bị ràng buộc-điều khiển-nhìn-chỉnh sửa-u http://stackoverflow.com/questions/269073/observablecollection-that-also-monitors-changes-on-the-elements-in-collection –

Trả lời

2

Bạn có thể tạo deep copy đối tượng bạn muốn chỉnh sửa. Bằng cách này, bạn có thể hành động trên bản sao trong khi chỉnh sửa, mà không can thiệp vào bản gốc vẫn còn trong danh sách. Khi bạn đã chỉnh sửa xong, bạn có thể thay thế bản gốc theo phiên bản đã chỉnh sửa hoặc khôi phục.

+0

Cảm ơn bạn. Tôi đã thử phương pháp này trước đây, nhưng vì nó sử dụng serialization của các đối tượng lồng nhau, một số đối tượng không thể được tuần tự hóa và các đối tượng nhân bản vô tính không thể được sử dụng một cách hoàn hảo hơn nữa. – OrPaz

+0

@OrPaz: có thể sao lưu các đối tượng của bạn theo cách này hay cách khác, có thể chứng minh quan trọng, đặc biệt nếu bạn xem xét sử dụng giao diện IEditableObject như đề xuất của Thomas. – Matthieu

+0

Tôi đã thử sao chép sâu đối tượng bằng cách sử dụng serialization hoặc thực thể cloners có sẵn. Mặc dù nó hoạt động, tôi không thể sử dụng chúng vì nó thực sự mất gần 5 (!) Giây để thực hiện các bản sao .... Bất cứ đề nghị? (theo dõi một câu hỏi mới tại đây: http://stackoverflow.com/questions/4034477/entity-framework-attach-exception-after-clone) – OrPaz

3

Bạn có thể sử dụng:

BoundPropertyOfViewModel = CollectionViewSource.GetDefaultView(AgentDeploymentDetail); 

và liên kết với màn hình thay vì ràng buộc trực tiếp đến ObservableCollection. Đây là cùng một đối tượng cho phép bạn lọc/sắp xếp đầu ra của bạn mà không cần chạm vào bộ sưu tập.

Khi bạn muốn ngừng thay đổi, hãy sử dụng DeferRefresh(). Khi bạn hoàn tất, hãy gọi Refresh().

CẢNH BÁO

này sẽ không pervent hiển thị những thay đổi trong từng hạng mục riêng của mình, chỉ có danh sách.

+0

Điều này sẽ ngăn chế độ xem làm mới khi các mục được thêm vào hoặc bị xóa khỏi bộ sưu tập, nhưng nó sẽ không ngăn các mục nâng thông báo 'PropertyChanged' của riêng chúng, sẽ được phản ánh trong chế độ xem ... –

+0

Vâng, bạn nói đúng.Tôi nghĩ chỉ có danh sách là câu hỏi ở đây. Tôi sẽ cập nhật câu trả lời của mình. – Aliostad

+0

Cảm ơn bạn. Mục đích chính của tôi là thay đổi chỉnh sửa khối, không thêm/xóa thay đổi. – OrPaz

5

Tôi nghĩ rằng vấn đề không phải là với bộ sưu tập, nhưng với chính các thực thể đó. ObservableCollection tăng sự kiện khi một mục được thêm vào hoặc bị xóa, không phải khi thuộc tính của một mục bị thay đổi. Phần này được xử lý bởi mục INotifyPropertyChanged do mục này thực hiện, vì vậy đây là thông báo bạn cần phải tắt.

Tôi khuyên bạn nên xem giao diện IEditableObject, được thiết kế cho loại kịch bản này. Bạn có thể tắt thông báo theo phương thức BeginEdit và có thể bật lại chúng trong EndEditCancelEdit.


EDIT: Paul Stovell có thực hiện tốt đẹp của một IEditableObject wrapper đây: http://www.paulstovell.com/editable-object-adapter

+0

Cảm ơn bạn. Mặc dù tôi quan tâm đến cách tiếp cận đó, liên kết tải xuống dự án dường như bị hỏng. – OrPaz

0

Tất cả các anwers trên là tuyệt vời. nhưng tôi tìm thấy một prodedure tốt và convinent để thực hiện mong muốn một cách hiệu quả và sạch sẽ. Nó dựa trên việc thực hiện một bản sao sâu trên một đối tượng tách rời, sử dụng cloner Matthieu MEZIL (http://msmvps.com/blogs/matthieu/archive/2008/05/31/entity-cloner.aspx).

Để biết chi tiết đầy đủ xin vui lòng kiểm tra các nội dung sau: Entity Framework Attach Exception After Clone

Cảm ơn tất cả sự ủng hộ tuyệt vời ...