2011-11-13 43 views
1

我開始探索MVVM燈,並開始設計我不同的viemModels。我瀏覽了很長時間才知道我在找什麼,但是我找不到它:-(。每個視圖模型應該由單個ViewModelLocator處理嗎?

我有一個示例是基於一個MainViewModel,它是在ModelViewLocator中處理的。在大多數情況下,我們將有超過一個視圖模型,所以應該全部的ViewModels在一個單一的ViewModelLocator文件中定義或做我必須有每個視圖一個ViewModelLocator

換句話說,我需要得到這個: MainViewModel - > MainViewModelLocator PictureViewModel - > PictureViewModelLocator


好吧,但有一個問題: 讓我說,我有3 viewModels,我創建ViewModel1,2和3 在ViewModelLocation中,我已創建相同的結構作爲MainViewModel爲了創建它的實例,並創建一個主要屬性訪問Models實例。

我發現的問題是,如果我的每個視圖對應於每個viewModels被設置爲自己的datacontext作爲ViewModelLocator.ViewModelx,視圖實例是在設計時創建的,它使我麻煩,如果在我的構造函數view我需要調用一個從WCF服務獲取數據的外部類。它會產生一個「實例創建錯誤」。

另一方面,如果在每個視圖中,我綁定然後不是從ViewModelLocator.ViewModelx,而是作爲直接ViewModelx然後我沒有得到該錯誤,並更好地工作。

那麼什麼是properway做和邏輯路徑:

1 - 是否MainViewModel應該創建所有其他視圖模型的? 2 - ViewModelLocator中的每個View都必須綁定到它自己的MainStatic propery嗎? 3 - 每個視圖是否創建自己的ViewModel實例?

我這樣做的方式是,ViewModel構造函數創建期間從外部類返回服務數據的View僅在將其直接綁定到ViewModel時才起作用,這樣做是否有困難?

回答

4

通常不需要多視圖模型定位器。常見的方法是創建一個ViewModelLocator,然後將其添加到App.xaml中的Application.Resources,以便可用於應用程序中的任何位置。只需在ViewModelLocator中爲您正在使用的每個ViewModel創建一個屬性。

下面是一個使用MVVM Light 4(beta)中的IoC容器實例化視圖模型的示例。您也可以不使用IoC容器,但是在更復雜的情況下,它肯定會簡化您的代碼:

public class ViewModelLocator 
{ 
    static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     SimpleIoc.Default.Register<MainViewModel>(); 
     SimpleIoc.Default.Register<DetailsViewModel>(); 
    } 

    public MainViewModel MainViewModel 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<MainViewModel>(); 
     } 
    } 

    public DetailsViewModel DetailsViewModel 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<DetailsViewModel>(); 
     } 
    } 
} 
相關問題