2010-01-04 23 views
2

當我用當前的應用程序解決越來越多與MVVM相關的問題時,更多的只是不斷彈出。 :)將MVVM應用到用UserControls填充的ItemsControl中

我想要替換的當前實現涉及一個StackPanel,其子代或多或少動態生成(通過查找配置文件)。每個孩子都是一個UserControl的實例。之前,我所做的是爲StackPanel指定一個名稱,然後在Window_Loaded事件處理程序中,我只需確定所需數量的子項,爲每個實例化一個UserControl,併爲UserControl分配一個ID,以便知道點擊特定UserControl實例的按鈕的正確來源;每個UserControl上有3個按鈕。

所以我知道我想將StackPanel綁定到一個集合。這當然是不可能的,因爲我需要使用從ItemsControl派生的東西,比如ListBox或ListView(或者甚至ItemsControl本身)。爲了在MVVM-ifying的第一次迭代中保持簡單,我只使用一個ListBox。

現在的問題是,如果我的代碼隱藏的ObservableCollection是一個ObservableCollection?我相信這意味着無論我如何使用我的GUI,這個ListBox將始終有子項,但是它們在MyUserControl的XAML文件中執行。我想這也是可定製的,但我認爲這意味着我必須將MVVM模式應用於UserControl。

回答

5

如果您希望每個列表項目都有不同的模板,並且想要堅持使用MVVM風格,那麼最好不要考慮UserControls。

您可以讓主視圖將ListBox綁定到可觀察的View Model實例集合。如果您設置數據模板以將ViewModel類映射到適當的UserControl,則不需要顯式加載UserControls - 只需將任何ItemsControl綁定到您的ViewModels集合,然後讓數據模板負責構建並將其映射到該VM的正確UserControl。

+0

我不需要每個ListItem都有不同的模板,但我絕對要堅持使用MVVM風格。事實證明,無論如何,我無法做我曾經提出的建議,因爲UserControl已經引用了ViewModel,因此我最終得到了一個循環引用。 我會給這個ViewModel方法一個鏡頭,看看它需要我。謝謝! – Dave 2010-01-04 19:13:17

+0

是的 - 每個Item都可以是一個獨立的ViewModel類,這意味着它將獲得自己的模板(如果您爲每個ViewModel設置DataTemplate以將其映射到適當的View)。這可以是一個單獨的UserControl。我一直這樣做 - 它基本上使它成爲一個虛擬機列表,完全獨立於視圖 - 純粹的MVVM :) – 2010-01-04 19:15:33

+0

我只是在旁邊試圖幫助Expression Blend論壇中的某個人,但我會研究這種使用DataTemplates將VM綁定到V的方法。這不是我之前做過的,甚至聽說過的。我只是喜歡嘗試應用MVVM--我發現我通過這個過程學習了更多關於WPF的內容!謝謝你的建議! – Dave 2010-01-04 19:53:18

1

如果不需要,您的收藏不一定是ObservableCollectionObservableCollection的「可觀察」部分僅僅是提供事件以通知其他人集合已經改變的事情,但這絕不涉及視覺表示。

ObservableCollection是非常適合MVVM因爲所有的事件通知其提供,但最終,無論你使用List<T>ObservableCollection<T>使得事情在任何給定時間點在視覺上顯示的方式沒有什麼區別。

+0

感謝您對ObservableCollections的澄清,我想我會只是將它用於數據綁定任何類型的集合,但是您已經提醒我主要是爲了更改通知。在我的應用程序中,我沒有真正具有ComboBoxes等內容的動態更改 - 它們僅通過一次數據綁定,所以也許我應該回去把它們改爲(可能)更少的開銷? – Dave 2010-01-04 19:11:38

+0

@D。Matsumoto:如果你知道這些項目永遠不會改變,那麼你可以使用列表 - 但如果你可能,在某些時候,決定添加/刪除列表中的項目,我只是使用ObservableCollection 。大部分「開銷」實際上只是一個問題,憤怒,在這種情況下,你想額外的開銷... – 2010-01-04 19:16:46

+0

不要因爲擔心可能的開銷而打破MVVM。不成熟的優化... – 2010-01-04 19:17:18