2010-11-11 99 views
3

我正在寫一個小應用程序來學習WPF/MVVM,並且我遇到了一個難題,我有一個viewmodel對象準備好了,但我不知道在哪裏實例化它。我在哪裏實例化我的視圖模型對象?

viewmodel表示單個窗口數據(一些滑塊值,一個進度條值和一些文本字符串,其中一些直接附加到暴露的模型上,另一些在視圖模型中以避免向模型添加新功能)

我一次只會需要1個這樣的對象(每個窗口,但我只允許1個窗口),儘管它實際上不是一個singleton。它會存在的一生的窗口,雖然(這是正常的?)

所以我的問題是這樣的:我應該實例viewmodel作爲App.Xaml中的靜態資源,作爲App.xaml的成員。 (在重寫的「OnStartup」方法內部)或作爲Window.xaml中的資源或Window.xaml.cs中的對象執行。

我已經看到人們把它作爲一個本地資源和一個全局對象的啓動,但對我來說,它似乎不應該在代碼背後(我所做的一切都是把它拋在空中,一旦它存在,它可以處理所有其他事情,實際上這就是它的重點)。

因此,思考視圖模型應該在哪裏實例化?

回答

4

窗口的視圖模型只存在於其窗口的整個生命週期中是完全正常的。創建它可以像放:

DataContext = new MainWindowViewModel(); 

在構造函數MainWindow。這就是我在沒有令人信服的理由的情況下做到的。 (如果窗口需要在其事件處理程序中與視圖模型進行交互操作(有時會這樣做),我將爲該對象創建一個專用字段,這樣我就不必在所有事件處理程序中繼續鑄造DataContext。 )

通常,視圖模型需要與一個或多個域對象進行互操作。在這種情況下,挑戰就是提出一種告訴視圖模型關於該對象的方法,而不將域對象與創建視圖模型的窗口相耦合。這是您開始使用服務和服務定位器以及可嘲諷對象等的地方。

但是,即使你這樣做,你仍然可以簡單地在窗口的構造函數創建視圖模型,如:

ServiceLocator loc = (ServiceLocator) FindResource("AppServiceLocator"); 
DataContext = new MainWindowViewModel(loc); 

我唯一一次創建窗口的窗口的視圖模型構造函數是當某個其他對象(如另一個窗口中的命令)正在創建窗口並設置它的DataContext時。

0

我通常走的是ViewModelLocator的概念。 ViewModelLocator是App.xaml中的StaticResource。

的ViewModelLocator使用利用國際奧委會Dependecy注入(Ninject /團結/ ...),它可以定義在DI爲您的視圖模型的Livetime一個範圍...

也有一些相關博客文章在那裏與MEF和ViewModelLocator概念一起工作...

相關問題