2009-10-16 72 views
10

我正在實現一個顯示項目列表的wpf應用程序,並提供了通過在文本框中輸入來過濾此列表的功能(我認爲這是相當平凡的用例)。MVP/MVVM - 篩選清單,誰負責?

我們正在使用MVVM結構。

我的問題是,誰的責任是過濾列表?視圖還是視圖模型? 我應該在xaml.cs中實現一個「OnTextChanged」事件,還是應該在ViewModel中使用一個屬性並使用PropertyChanged過濾列表。
後續問題是,我應該在ViewModel中使用BindingList/ObservableCollection,還是使用ICollectionView將ItemsControl綁定到?

我嘗試了兩種方法,他們都工作。賦予ViewModel責任將視圖中的代碼保留爲空,但另一方面,我並不完全相信ViewModels的責任是應用過濾(例如:不同的視圖可能需要不同的過濾)

任何想法?

感謝, 羅埃爾

編輯:

讓我困擾約把它在視圖模型是,(在我目前的實現)有一個參考System.Windows.Data。這是我在ViewModel中不希望看到的參考,因爲它顯然與View有關。或者我錯過了什麼?相關代碼:

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

這是一個很好的問題,尤其是需要引用System.Windows.Data的ViewModel。 – pauldoo 2010-06-04 15:36:43

回答

6

ViewModel,毫無疑問。避免代碼隱藏是模式的最終目標 - 事實上,ViewModel本身就是視圖背後的代碼。

如:不同的觀點可能需要 不同的過濾

不同的看法應該有不同的ViewModels。 ViewModel基本上是一種(更多)面向對象代碼隱藏文件的方法。

關於CollectionView:您可以在視圖XAML中定義CollectionViewSource,然後將其排序和過濾屬性綁定到ViewModel。這應該保持在ViewModel和CollectionView中的控制,但我相信它是過度工程。

3

我覺得這種過濾功能屬於viewmodel。請記住,你希望在視圖模型中保留儘可能多的可測試代碼(你將進行單元測試,對吧?)。相反,你會想保持觀點精益和平均。

過濾功能是通用的,不會像這樣綁定到視圖。但是,如果不同的視圖需要不同的過濾,則應該將其視爲視圖模型支持的附加功能。

1

沒有正確的技術答案。該模式的目的是在功能和美學的關注點分離,基於一個藝術設計人員不理解如何實現功能,並且UI很難測試。

但是,如果您可以將過濾參數化爲非常簡單的過濾,一個名爲「地區」的文本屬性,可以設置爲「歐洲」,「北美」,「亞洲」等,這很容易理解,並且可以獨立測試。它可以讓你對功能(在一個非常有限的意義上)進行一點控制。如果這對你的努力有一定的價值,那就去做吧。如果沒有,不要。

而最終,如果嘗試應用這種模式是造成你停下來想知道哲學的區別,在昂貴的生產率,那麼它不會幫你。

4

你可以在我的博客,我使用MVVM方法來篩選項目的集合退房this article。我認爲這絕對是虛擬機課程的責任。

0

我同意你在VieModel中存在View技術泄漏的問題。同樣,我在使用System.Windows.Input的ViewModels中使用RelayCommand對象。

儘管這裏介紹的所有原因,我認爲ViewModel是這種媒體(wpf/silverlight)的正確設計選擇,儘管它不夠完美。