事件發生在我們的Model和ViewModel中,它們需要創建相應的View。問題是如何做到這一點,並避免在虛擬機或M中有任何查看代碼?如何從ViewModel實例化視圖?
這裏的事件序列,所以你可以看到這個兩難問題:
用戶設置的形式很多領域開始一個長期運行的後臺進程,然後點擊「開始」按鈕。如果這個長時間運行的過程成功,那麼它需要彈出一個包含圖形的圖表來顯示結果。但是,如果數據因任何原因無法處理,則無法彈出圖表,而是記錄窗體上文本框中顯示的錯誤消息。
現在,該開始按鈕會調用ViewModel中實際啓動後臺線程的方法。
只有背景可以確定何時或是否創建視圖。
目前我們通過使用一個名爲ChartInterface的接口來工作。該視圖實現此接口,然後將回調委託一直設置到後端模型。當它決定創建Chart時,它會調用回調並使用該接口傳遞適當的數據等。
但是,這提出了一個問題,因爲它可能會產生數十或數百個圖表。因此,我們需要有一個「儀表板」,其中包含所有圖表的列表供用戶選擇要查看的圖表。
所以,現在後端需要決定何時或如何創建儀表板視圖,然後向其添加圖表視圖。
所以它變得更加混亂,因爲這些情況會越來越多,因爲我們有很多需要視圖的模型,因此創建大量的回調委託會變得很難看。
一個似乎簡化而不是大量回調的想法是僅將一個接口傳遞給ViewBinder到後端。然後每次創建一個模型對象時,它都可以將它傳遞給ViewBinder以查看它是否想要將任何視圖對象綁定到它。
我們的想法是,大多數後端對象都會很有趣(最終)以圖形方式監視。因此,如果構造後的每個人都傳遞給ViewBinder接口,則視圖可以決定是否要將任何東西綁定到它。
這聽起來更好。
我的方法是後臺進程應創建結果的ViewModel而不是View。 – hyp 2013-02-22 12:39:31
@ hyp。對不起,它不明確。它確實創建了一個Model和一個ViewModel。但是,如何讓視圖被創建並綁定到它?麻煩的是,View層沒有知道什麼時候需要這樣做。只有後臺才知道何時應該創建視圖模型並將視圖綁定到ViewModel。 – Wayne 2013-02-22 15:59:16
正確,所以如果你有一個ViewModel的結果,相應的視圖應該被創建爲任何其他視圖。不知道你如何用你的其他ViewModels做,但我總是假設基於服務的路徑。換句話說,你有一個服務,你把虛擬機放在其上,並加載相應的View。 MVVM框架會讓你更容易,我會推薦「Catel」@ http://catel.codeplex.com/。希望這有助於 – hyp 2013-02-22 16:08:33