2009-10-16 33 views
10

Tôi đang triển khai ứng dụng wpf hiển thị danh sách các mục và cung cấp chức năng lọc danh sách này bằng cách nhập vào hộp văn bản (trường hợp sử dụng khá nhỏ).MVP/MVVM - Lọc danh sách, ai có trách nhiệm?

Chúng tôi đang sử dụng cấu trúc MVVM.

Câu hỏi của tôi là, ai có trách nhiệm lọc danh sách này? Chế độ xem hoặc chế độ xem? Tôi có nên triển khai sự kiện "OnTextChanged" trong xaml.cs hay tôi nên sử dụng thuộc tính trong ViewModel và sử dụng PropertyChanged để lọc danh sách.
Câu hỏi tiếp theo là, tôi có nên sử dụng BindingList/ObservableCollection trong ViewModel hay sử dụng ICollectionView để ràng buộc ItemsControl không?

Tôi đã thử cả hai phương pháp và cả hai đều hoạt động. Đưa ViewModel trách nhiệm giữ mã phía sau từ Chế độ xem trống, nhưng mặt khác, tôi không hoàn toàn bị thuyết phục rằng trách nhiệm ViewModels là áp dụng lọc (ví dụ: các chế độ xem khác nhau có thể yêu cầu lọc khác nhau)

Bất kỳ suy nghĩ nào ?

cảm ơn, Roel

EDIT:

gì làm tôi bực mình về đặt nó trong ViewModel đó là (trong việc thực hiện hiện tại của tôi) có một tham chiếu System.Windows.Data. Đây là một tài liệu tham khảo tôi không muốn có trong ViewModel vì nó rõ ràng là một cái gì đó Xem liên quan. Hay tôi đang thiếu một cái gì đó? mã có liên quan:

ICollectionView customerView = CollectionViewSource.GetDefaultView(customers); 
+0

Đây là một câu hỏi hay, đặc biệt là về ViewModel yêu cầu tham chiếu đến 'System.Windows.Data'. – pauldoo

Trả lời

6

ViewModel, không nghi ngờ gì. Tránh code-behind là mục tiêu cuối cùng của mô hình - trên thực tế, chính ViewModel là mã phía sau khung nhìn.

ví dụ như: quan điểm khác nhau có thể yêu cầu lọc khác nhau

quan điểm khác nhau nên có ViewModels khác nhau. ViewModel về cơ bản là một cách tiếp cận hướng đối tượng (phần nào hơn) đối với các tệp mã-đằng sau.

Về CollectionView: bạn có thể xác định CollectionViewSource trong chế độ xem XAML, sau đó ràng buộc thuộc tính sắp xếp và lọc của nó cho ViewModel. Điều đó sẽ giữ quyền kiểm soát trong ViewModel và CollectionView trong chế độ xem, nhưng tôi tin rằng đó là kỹ thuật quá mức.

3

Tôi nghĩ loại chức năng lọc này thuộc về chế độ xem. Hãy nhớ rằng, bạn muốn giữ nhiều mã có thể kiểm tra nhất có thể trong viewmodel (mà bạn sẽ kiểm tra đơn vị, đúng không?). Ngược lại, bạn sẽ muốn giữ cho chế độ xem gọn gàng và có ý nghĩa.

Chức năng lọc là chung chung và không bị ràng buộc với chế độ xem như vậy. Nhưng nếu một chế độ xem khác nhau cần lọc khác nhau, bạn sẽ thấy đó là chức năng bổ sung được hỗ trợ bởi chế độ xem.

1

Không có câu trả lời đúng về mặt kỹ thuật. Mục đích của mô hình là phân chia mối quan tâm về chức năng và tính thẩm mỹ, trên cơ sở một người thiết kế nghệ thuật không hiểu cách triển khai chức năng và UI khó kiểm tra.

Nhưng nếu bạn có thể tham số hóa việc lọc thành một thứ rất đơn giản, ví dụ: một thuộc tính văn bản được gọi là "Vùng" có thể được đặt thành "Châu Âu", "Bắc Mỹ", "Aisa", v.v. khá dễ hiểu và có thể kiểm tra độc lập. Nó cho phép bạn đặt một chút kiểm soát chức năng (trong một ý nghĩa rất hạn chế) vào khung nhìn. Nếu điều đó có một số giá trị cho những nỗ lực của bạn, thì hãy làm điều đó. Nếu không, đừng.

Và cuối cùng, nếu cố gắng áp dụng mẫu này là khiến bạn tạm dừng và tự hỏi về sự phân biệt triết học, với chi phí sản xuất đắt đỏ, thì nó không giúp bạn.

4

Bạn có thể xem this article trên blog của mình nơi tôi sử dụng phương pháp MVVM để lọc một tập hợp các mục. Tôi nghĩ đây là trách nhiệm của lớp VM.

0

Tôi đồng ý với bạn rằng thật đáng lo ngại rằng có Xem rò rỉ công nghệ trong VieModel. Trong một tĩnh mạch tương tự, tôi sử dụng một đối tượng RelayCommand trong ViewModels của tôi đang sử dụng System.Windows.Input.

Vì tất cả các lý do được đăng ở đây, tôi nghĩ ViewModel là lựa chọn thiết kế chính xác cho phương tiện này (wpf/silverlight), mặc dù nó ít hoàn hảo hơn.

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