2013-03-23 31 views
1

在我的情況下,我有很多視圖(用戶控件),作爲它的一部分包含一些過濾器選項。舉例來說,總共有10個過濾器選項,但並非所有視圖都顯示全部10個過濾器選項。其中一些僅顯示3個,其中一些8個等。重要的是,當在一個視圖上設置了一個過濾器選項時,包含此過濾器選項的所有視圖都應具有相同的值。MVVM設計 - 處理常見ViewModel幾個視圖

AView: filterOption1, FilterOption2, FilterOption3 
BView: filterOption1, FilterOption3, FilterOption5 
CView: filterOption2, FilterOption4, FilterOption6, FilterOption7 

當用戶集上AView filterOption1 =真,相同的值應該在使用filterOption1(前BView)的所有視圖中設置。這導致我決定擁有一個CommonViewModel(單例),它將包含公共(共享)數據,並且將公開其中的所有過濾器選項,並且所有視圖都應該綁定到此CommonViewModel。

爲了顯示特定視圖過濾器選項,我能想到的兩種方法:

1)設計ONE CommonView,對於每個表示創建新的實例,並隱藏其中不需要

<DataTemplate DataType="vm:CommonViewModel"> 
    <vw:CommonView ShowFilterOption1="True" ShowFilterOption3="True" /> 
</DataTemplate> 
過濾器選項

2)設計爲每個不同的表示單獨的視圖(不同的濾波器選項)

你怎麼看待這些方法,你更喜歡哪一個是什麼,你有沒有一些其他的想法,什麼是最好的町冰是否遵循適當的MVVM設計?結合一個視圖模型,一次在視圖模型的屬性

回答

1

n個視點改變看法應該更新=結合twoways到該屬性

1)一個視圖與所有過濾器選項意味着你需要自定義邏輯僅在顯示過濾器選項,你希望看到。 =綁定到可見性

2)單獨的視圖爲每個不同的表示形式的過濾器選項也是一種可能性,但我會這樣做,只有當更多的每個單獨的視圖包含一些額外的控制或邏輯,使每個獨立的視圖不知何故使用1 )。

+0

有一個CommonView可能產生的複雜性是如何佈置過濾器選項。正如我所說的,在20個視圖中使用了7-8個過濾器選項,但並非所有過濾器選項都用於所有視圖。這意味着我需要在代碼中進行一些複雜的佈局處理,因爲我需要有一些類似於fitler選項的網格,其中行/列將被動態設置。 – Goran 2013-03-24 11:55:13

+0

是的,如果我們可以將東西拖到一起,我的朋友編程就會變得很有趣..但它不是這種情況,所以在您的示例中,您將需要一個堆棧面板或網格並在運行時添加uielements ..您還需要隱藏你的filteroptions,並在需要時顯示它們。那就是爲你的一個視圖編寫邏輯的一部分 – 2013-03-24 12:02:32

+0

我的朋友,我沒有從編寫代碼開始,這是最簡單的部分。你能寫一些關於這兩種方法的缺點,因爲從你寫的內容來看,我沒有得到任何關於爲什麼的信息,你說的大部分內容都是我應該如何實現我命名的方法,這不是我的問題。我現在做出的決定將對應用程序產生重大影響,因爲將有30多個應用程序受其影響,所以我需要100%確定最佳方法。 – Goran 2013-03-24 12:38:00

0

對我來說,這種邏輯 - 是否將特定的filterOption包含到視圖中,實際上屬於視圖模型,而不是視圖。 我會考慮實現一個視圖,並分別爲每個A,B,C的視圖模型實例。視圖模型可以是一個類,它將通過它將顯示的filterOptions進行參數化。

+0

這mehtod將需要同步每個ViewModel之間的值。這會給項目帶來很大的複雜性,很可能某些財產可能會不同步。維護價格高漲...或者你有一些想法如何輕鬆做到這一點? – Goran 2013-03-24 11:44:57

+0

關於「對我而言,這種邏輯實際上屬於視圖模型,而不是視圖。」據我瞭解,ViewModel處理表現邏輯和狀態,它不應該處理它的視覺表現。在這種情況下,我可以在視圖上使用過濾器,或者不使用過濾器。 ViewModel爲過濾提供支持(邏輯),但是否會設置一些過濾器,對我來說是View的責任。 – Goran 2013-03-24 11:48:11

+0

您仍然可以在一個地方擁有所有文件管理器選項的超集。然後你有另一個ViewMOdel類(也許它只是一個集合),它代表過濾器的一個子集。 – Volma 2013-03-24 15:41:32