2012-03-05 34 views
11

Các sự cố tiềm ẩn gây ra bởi hoạt động hỗ trợ ObservableCollection như AddRange hoặc RemoveRange là gì? Phải có một lý do tại sao Microsoft không cung cấp cho họ, bây giờ ObservableCollection thường được sử dụng với WPF.Tại sao ObservableCollection không hỗ trợ thay đổi hàng loạt?

Bạn có thể triển khai bộ sưu tập của riêng mình hỗ trợ hoạt động hàng loạt và triển khai INotifyCollectionChanged. Điều gì sẽ xảy ra nếu tôi liên kết một điều khiển như vậy với một ItemsControl?

Có ai biết về ItemsControls không hỗ trợ thay đổi hàng loạt không?

+6

Có một lớp BulkObservableCollection trong Microsoft.VisualStudio.Language. Intellisense.BulkObservableCollection http://msdn.microsoft.com/en-us/library/dd867973.aspx – tofutim

Trả lời

3

Tôi không nghĩ rằng có bất kỳ nhược điểm hoặc vấn đề tiềm ẩn nào, chỉ là nó không có ở đó. Trong thực tế, bạn sẽ thấy rằng hầu hết các loại trong 'System.Collections.Generic' cũng không cung cấp chức năng 'AddRange'.

Trong khi đó, nhiều người đã tạo phiên bản 'ObservableCollection' của riêng họ để cung cấp chức năng mà bạn muốn.INotifyCollectionChanged chứa đủ thông tin cho các trình xử lý của nó để lưu ý khi một loạt các mục bị ảnh hưởng có thể vì lý do này.

Cuối cùng nhưng không kém, nếu bạn liên kết một bộ sưu tập mà có những hoạt động kiểu 'Range' bạn sẽ thấy rằng họ sẽ làm việc với giao diện người dùng của bạn như bạn mong đợi

4

Có nhiều tiện ích mở rộng cho ObservableCollection có thể được tìm thấy trên internet có thêm khái niệm thêm/xóa phạm vi hoặc cho phép bạn trì hoãn cập nhật và kích hoạt chúng theo cách thủ công. Ví dụ thấy điều này câu hỏi Stack Overflow:

ObservableCollection Doesn't support AddRange method, so I get notified for each item added, besides what about INotifyCollectionChanging?

Bạn cũng có thể thực hiện một add số lượng lớn mà bắn một sự kiện thiết lập lại, mà sẽ làm cho giao diện người dùng để lại làm cho tất cả các mặt hàng trong bộ sưu tập:

http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/

Chúng cho phép bạn quản lý hiệu quả hơn các cập nhật giao diện người dùng. Làm thế nào một ItemsControl xử lý một sự kiện thay đổi bộ sưu tập mà chi tiết một danh sách các mặt hàng thay đổi là lên đến khuôn khổ WPF chính nó. Tôi giả sử nó xử lý thông minh này!

Lời khuyên của tôi đối với bạn là, nếu hiệu suất rất quan trọng đối với bạn và bạn có các bộ sưu tập với nhiều mục đang được cập nhật và gặp sự cố về hiệu suất, sau đó phân lớp ObservableCollection để quản lý thông báo đã thay đổi bộ sưu tập theo cách phù hợp nhất với nhu cầu của ứng dụng của bạn.

+0

Nhìn lướt qua việc triển khai câu hỏi được liên kết cho thấy việc triển khai không hiệu quả. Về cơ bản, sự kiện 'CollectionChanged' được nâng lên cho mỗi mục được thêm vào, sau đó lại đặt lại bộ sưu tập! –

+1

@KentBoogaart hi Kent, ý bạn là câu trả lời SO? trông ổn với tôi. Phương thức AddRange lặp qua các mục được thêm vào sau đó kích hoạt một sự kiện CollectionChanged, với một kiểu thay đổi 'add' cung cấp danh sách các mục được thêm vào. Định dạng của mã không tốt như vậy mặc dù ;-) – ColinE

+1

kể từ khi RangeObservableCollection mở rộng ObservableCollection, gọi Add trên mọi mục kết quả trong CollectionChangedEvent được nâng lên cho mỗi mục được thêm vào. Sau đó tất cả những nỗ lực đó sẽ bị lãng phí bằng cách đặt lại bộ sưu tập sau khi tất cả các mục được thêm vào. –

2

NotifyCollectionChangedEventArgs bao gồm thông tin chỉ mục. Việc xóa các mục làm cho các chỉ mục cải tổ, cũng như chèn các mục. Do đó, trong khi không hoàn toàn không thể, nó sẽ là khá khó khăn và có lẽ không hiệu quả để cung cấp khả năng làm việc với các phạm vi.

+0

Thông tin chỉ mục duy nhất là "chỉ mục mà tại đó thay đổi xảy ra". Thông tin này dễ dàng được cung cấp với việc thêm và loại bỏ các hoạt động phạm vi. –

+0

@ A.R .: không, nếu tôi xóa các mục đầu tiên và cuối cùng của bộ sưu tập thì sao? Chỉ có một chỉ mục trong sự kiện args, nhưng hai chỉ mục là cần thiết. –

+0

Có hai chỉ mục. Có 'NewStartingIndex' và 'OldStartingIndex'. Mô tả thứ hai đọc "Gets chỉ mục mà tại đó một hành động Move, Remove, hoặc Replace xảy ra.", Ngoài ra, trừ khi bạn đang loại bỏ TẤT CẢ các mục trong bộ sưu tập, kịch bản bạn mô tả là không thể vì các phần tử trong một phạm vi tiếp giáp. –

1

Có phải là một lý do tại sao Microsoft không cung cấp cho họ

Họ không cung cấp tất cả các mảnh có thể chức năng, đó là (cũng) với chi phí so với điều nhu cầu.

Bạn có thể triển khai bộ sưu tập của riêng mình hỗ trợ hoạt động hàng loạt và triển khai INotifyCollectionChanged.

Có. Và khi bạn thực hiện, bạn sẽ thấy rằng bộ sưu tập sẽ phải đưa ra lựa chọn về cách thức/thời điểm truyền bá những thay đổi đó. Tôi chưa bao giờ thử nhưng tôi tưởng tượng có một số sự cân bằng mà View hoặc ViewModel có thể đưa ra quyết định tốt hơn về một bộ sưu tập có thể tái sử dụng.

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