2012-12-19 25 views
9

Vâng, tôi đang bối rối.Việc liên kết với các bộ sưu tập thực sự hiệu quả như thế nào?

Nếu điều khiển của tôi có thuộc tính phụ thuộc ItemsSource của IEnumerable loại và người dùng liên kết bộ sưu tập với đối tượng nào tôi có trong DependencyPropertyChangedEventArgs.NewValue?

Theo như tôi biết CollectionView được tạo hoàn toàn cho các bộ sưu tập và tôi mong đợi args.NewValue là loại ICollectionView.

Từ this blog:

Khi người dùng liên kết với một tài sản WPF để một tập hợp các dữ liệu, WPF tự động tạo ra một cái nhìn để bọc các bộ sưu tập, và liên kết với các tài sản để xem, không phải là nguyên bộ sưu tập. Hành vi này luôn xảy ra và độc lập với CollectionViewSource.

Nhưng trình gỡ lỗi (VS 2012, .net v.4.0) cho tôi biết rằng tôi nhận được bộ sưu tập nguyên gốc ở NewValue. (BindsDirectlyToSource không được thiết lập và bằng false theo mặc định)
Làm thế nào điều này có thể được ?!

Tôi không thể hiểu cách thức trong trường hợp này, WPF kiểm soát hỗ trợ sắp xếp, nhóm và lọc.
Cách thức và thời điểm CollectionView được tiêm và sử dụng như thế nào?

Trả lời

4

Có thể trích sau đây từ phần chú thích trong CollectionView trả lời câu hỏi của bạn:

Trong các ứng dụng WPF, tất cả các bộ sưu tập có một liên quan đến mặc định xem bộ sưu tập. Thay vì làm việc trực tiếp với bộ sưu tập, động cơ ràng buộc luôn truy cập bộ sưu tập thông qua chế độ xem được liên kết. Để có chế độ xem mặc định, hãy sử dụng phương thức CollectionViewSource.GetDefaultView. Lớp nội bộ dựa trên Chế độ xem là chế độ xem mặc định cho các bộ sưu tập chỉ triển khai IEnumerable. ListCollectionView là chế độ xem mặc định cho các bộ sưu tập thực hiện IList. BindingListCollectionView là chế độ xem mặc định cho các bộ sưu tập triển khai IBindingListView hoặc IBindingList.

Hoặc, bạn có thể tạo chế độ xem bộ sưu tập của mình ở dạng mở rộng Ngôn ngữ đánh dấu ứng dụng (XAML) bằng cách sử dụng lớp CollectionViewSource và sau đó liên kết điều khiển của bạn với chế độ xem đó. Lớp học CollectionView Lớp nguồn là biểu diễn XAML của lớp CollectionView. Ví dụ, xem Cách: Sắp xếp và Nhóm Dữ liệu Sử dụng Chế độ xem trong XAML.

Vì vậy, nếu bạn không rõ ràng liên kết với một CollectionViewSource, một ràng buộc bộ sưu tập luôn được thực hiện cho các bộ sưu tập ban đầu (những gì bạn nhận được trong NewValue), nhưng quyền truy cập vào bộ sưu tập (ví dụ như nhận được một mục bằng index) là luôn thực hiện thông qua chế độ xem mặc định. Do đó, câu lệnh "liên kết thuộc tính với chế độ xem, không phải tập hợp thô" không chính xác là đúng.

Kiểm tra nhanh cho thấy rằng GetDefaultView trả về một System.Windows.Data.ListCollectionView cho ObservableCollection bị ràng buộc của tôi.

+0

Vì vậy, điều này có nghĩa là quyền kiểm soát của tôi ĐÃ yêu cầu CollectionView để thu thập thông qua và không có hỗ trợ nhóm, lọc và sắp xếp ra khỏi hộp. Đó là trách nhiệm của kiểm soát để thực hiện chức năng nói trên, phải không? –

+1

Có hỗ trợ out-of-the-box để nhóm, lọc và sắp xếp khi bạn liên kết rõ ràng với [CollectionViewSource] (http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource .aspx). Xem "Cách tạo chế độ xem" trong [Binding to Collections] (http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections) – Clemens

+0

Vâng, có vẻ như có. GroupItem được tạo ra bởi ItemsControl chính nó ... –

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