2013-02-22 92 views
0

事件發生在我們的Model和ViewModel中,它們需要創建相應的View。問題是如何做到這一點,並避免在虛擬機或M中有任何查看代碼?如何從ViewModel實例化視圖?

這裏的事件序列,所以你可以看到這個兩難問題:

用戶設置的形式很多領域開始一個長期運行的後臺進程,然後點擊「開始」按鈕。如果這個長時間運行的過程成功,那麼它需要彈出一個包含圖形的圖表來顯示結果。但是,如果數據因任何原因無法處理,則無法彈出圖表,而是記錄窗體上文本框中顯示的錯誤消息。

現在,該開始按鈕會調用ViewModel中實際啓動後臺線程的方法。

只有背景可以確定何時或是否創建視圖。

目前我們通過使用一個名爲ChartInterface的接口來工作。該視圖實現此接口,然後將回調委託一直設置到後端模型。當它決定創建Chart時,它會調用回調並使用該接口傳遞適當的數據等。

但是,這提出了一個問題,因爲它可能會產生數十或數百個圖表。因此,我們需要有一個「儀表板」,其中包含所有圖表的列表供用戶選擇要查看的圖表。

所以,現在後端需要決定何時或如何創建儀表板視圖,然後向其添加圖表視圖。

所以它變得更加混亂,因爲這些情況會越來越多,因爲我們有很多需要視圖的模型,因此創建大量的回調委託會變得很難看。

一個似乎簡化而不是大量回調的想法是僅將一個接口傳遞給ViewBinder到後端。然後每次創建一個模型對象時,它都可以將它傳遞給ViewBinder以查看它是否想要將任何視圖對象綁定到它。

我們的想法是,大多數後端對象都會很有趣(最終)以圖形方式監視。因此,如果構造後的每個人都傳遞給ViewBinder接口,則視圖可以決定是否要將任何東西綁定到它。

這聽起來更好。

+0

我的方法是後臺進程應創建結果的ViewModel而不是View。 – hyp 2013-02-22 12:39:31

+0

@ hyp。對不起,它不明確。它確實創建了一個Model和一個ViewModel。但是,如何讓視圖被創建並綁定到它?麻煩的是,View層沒有知道什麼時候需要這樣做。只有後臺才知道何時應該創建視圖模型並將視圖綁定到ViewModel。 – Wayne 2013-02-22 15:59:16

+0

正確,所以如果你有一個ViewModel的結果,相應的視圖應該被創建爲任何其他視圖。不知道你如何用你的其他ViewModels做,但我總是假設基於服務的路徑。換句話說,你有一個服務,你把虛擬機放在其上,並加載相應的View。 MVVM框架會讓你更容易,我會推薦「Catel」@ http://catel.codeplex.com/。希望這有助於 – hyp 2013-02-22 16:08:33

回答

0

答案在處理代碼時變得清晰。

public interface ModelBinderInterface void TryBind(object model); }

而不是一個全局的「服務器定位器」,每個視圖對象實現這個接口更自然。

然後,當它創建任何ViewModel對象時,它將自己分配給viewModel對象的ModelBinder屬性。

現在,ViewModel可以將相同的接口傳遞給後端進程。

當有任何相關模型被實例化時,它就會與該對象調用ModelBinder。

然後,View對象可以決定它是否可以實例化對象,如果不是,它可以將調用傳遞給它的也實現了ModelBinderInterface的父對象。

這種方式,每個視圖可以處理實例化的觀點,它明白這是否被添加到控制一個DataGridView或對象綁定到ListView等

當然,這仍允許一個單模型綁定器,因爲較低的級別可以繼續調用頂級應用程序ModelBinder,它只有一個,它可以提供單例實例。