2009-06-11 3 views
36

Tôi đang phát triển một ứng dụng WPF bằng cách sử dụng mẫu MVVM và tôi cần hiển thị một danh sách các mục trong một ListView (có lọc), với các trường của mục đã chọn được hiển thị trong khung nhìn Master/Detail. Tôi bị rách giữa hai cách làm như sau:MVVM: CollectionView trong ViewModel hoặc CollectionViewSource trong xaml?

  1. Trưng bày một bộ sưu tậpXem trong ViewModel của tôi và ràng buộc điều này.
  2. Hiển thị đơn giản IList trong ViewModel của tôi và sử dụng CollectionViewSource để tạo Bộ sưu tập trong XAML.

Có cách nào được chấp nhận để thực hiện việc này không? Bất kỳ suy nghĩ nào về cách tốt nhất?

+1

Thật ngạc nhiên khi nhiều lần bạn phát hiện ra rằng ai đó đã làm chính xác cùng một câu hỏi như bạn định hỏi. Cảm ơn! :) –

Trả lời

30

Tôi làm trước đây (phơi bày CollectionView từ máy ảo) nhưng điều thực sự quan trọng là nơi mà logic lọc của bạn là. Điều đó chắc chắn phải ở trong máy ảo để có thể kiểm tra, ngay cả khi chế độ xem có gắn dây cho máy ảo CollectionViewSource. Điều đó nói rằng, tôi không nghĩ rằng có bất cứ điều gì đặc biệt khó chịu hoặc chống MVVM về lộ một CollectionView từ máy ảo của bạn.

+0

Bạn có tạo một CollectionView mới trong ViewModel không? MSDN cho CollectionView nói rằng bạn không nên tạo một CollectionView mới mà thay vào đó tạo một CollectionViewSource và có được khung nhìn mặc định. Cách tốt nhất để tạo Bộ sưu tập là gì? –

+0

MSDN là không chính xác rõ ràng về cách tốt nhất để làm điều đó trong mã. Tôi chỉ tạo trực tiếp lớp con CollectionView (ví dụ: ListCollectionView), nhưng tôi cho rằng bạn cũng có thể sử dụng CollectionViewSource. Sự hiểu biết của tôi là CVS chỉ cần lựa chọn lớp con CV thích hợp cho bạn và cung cấp hỗ trợ XAML. Tôi đã không có bất kỳ vấn đề tạo CV mình, và nó có vẻ có ý nghĩa khi bạn đang làm nó trong mã và đã biết loại bộ sưu tập bạn đang gói. –

+0

Đừng quên rằng WPF tự động tạo ra các khung nhìn cho bạn khi bạn liên kết ... Bạn sẽ có được một ListCollectionView khi bạn liên kết với IList chẳng hạn. Điều này đã có TẤN của chức năng sắp xếp/lọc/nhóm nhưng dựa vào việc bạn nhận được bộ sưu tập Items của đối tượng mà bạn đang ràng buộc. Thay vào đó, bạn có thể sử dụng var view = CollectionViewSource.GetDefaultView (yourCollection) như ListCollectionView ;. Bạn có thể làm tất cả những thứ tuyệt vời sau đó. – Stimul8d

3

Tôi biết tôi hơi muộn trả lời câu hỏi của bạn nhưng tôi mới thấy nó hôm nay.

Tôi đã tạo mô hình chế độ xem chính/chi tiết sử dụng CollectionViewSource và viết blog về nó.

tôi đã viết về một viewmodel cho các bảng master/chi tiết ở đây có sử dụng: http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html

Bạn cũng có thể tìm thấy một viewmodel cho lớp ObservableCollection trên các trang blog của tôi.

Có thể bạn thấy nó sử dụng cho bạn.