2014-01-09 124 views
0

我在Windows Phone 8中使用Pivot Control,並且使用MVVM Light。MVVM Light - ViewModel reusage

我已經創建了一個UserControl,它將成爲每個PivotItem的內容,以及我的UserControl應該使用的ViewModel。

例如:

ObservableCollection<PivotItem> Pivots = new ObservableCollection<PivotItem>(); 
    for (i = 0; i < length; i++) { 
     Pivots.Add(new PivotItem() { Content = new MyUserControl() }); 
    } 

,通常在我的用戶構造我有這樣的事情(我認爲這不是一個很好的初步實踐?):

DataContext = new ViewModelLocator().MyViewModel; 

此視圖模型將從中獲取數據基於位置鍵的數據庫。我的問題是如何將該密鑰傳遞給MyViewModel而不是製作MyViewModel Singleton?

回答

0

首先 - 你不應該創建ViewModelLocator的新實例。有一個之一,它會自動添加到App.Resources元素中的App.xaml頁面。您可以在XAML中將其引用爲{StaticResource Locator}App.Resources [「Locator」] in code。

Secod問題 - 如果有多個樞軸,並希望多個不同的視圖模型的情況下,你可能能做的最好的事情就是不要在ViewModelLocator添加MyViewModel視圖模型,只是創建它存在的飛行。這樣你就不會把它作爲一個單例,而這正是你想要的。您不會以這種方式丟失任何MVVM Light功能,只需在每次創建控件時重新創建並重新獲取數據。

如果您用來獲取數據的「keys」來自約束集(因此會有類似於其中的5個而不是100個),並且想要在第一次加載後保持數據加載,您可以註冊在MyViewModel在ViewModelLocator的構造通常

SimpleIoc.Default.Register<MyViewModel>(); 

然後在代碼中使用的語法如下:

SimpleIoc.Default.GetInstance<MyViewModel>("somekeyvalue"); 

這會比較SimpleIoc內部提供的密鑰值現有視圖模型的字典,如果它已經存在將返回現有的實例,否則將創建一個新的,並將其存儲在密鑰下供將來重用。

+0

感謝您的回答。然後我將隨時創建ViewModels。 但我如何獲得ViewModelLocator在Windows Phone類的大會,我使用mvvm光的參考? – rdon

+0

我的意思是,如何在Windows Phone類庫中獲取ViewModelLocalor的引用,並使用mvvm光? – rdon