2013-08-01 29 views
2

我正在使用MVVM Light的WPF/MVVM應用程序。現在我的ViewModelLocator是相當標準的;它包含一個static構造函數,該構造函數通過SimpleIoc註冊視圖模型,並具有返回視圖模型當前實例的屬性。MVVM中正確使用ViewModelLocator的問題

我不知道這是多麼恰當,但我一直在探索在ViewModels中使用ViewModelLocator的實例來訪問其他ViewModel的屬性,並在我的某個視圖中更改ContentControl。如果這樣做有任何重大問題,請讓我知道,以便我能找到解決辦法。例如,我可以在一個視圖模型是這樣的:

private ViewModelLocator _viewModelLocator = new ViewModelLocator(); 

private void SomeMethod() 
{ 
    _viewModelLocator.OtherViewModel.SomeProperty = something; 
} 

在不同的視圖模型我有以下幾點:

private ViewModelLocator _viewModelLocator = new ViewModelLocator(); 

public ViewModelBase CurrentViewModel { get; set; } 

private void SomeMethod() 
{ 
    CurrentViewModel = _viewModelLocator.SomeViewModel; 
} 

在這種情況下,CurrentViewModel在我看來綁定到ContentControl

目前能夠做到這一點非常方便,但我想從更有經驗的程序員那裏得到一些輸入信息,以確保我不會在自己的腳下射擊。如果有問題,我可以採用更多可以接受的路線來實現相同的結果嗎?


現在,如果有不妥的上述做法,我想知道這是否是合適的和/或可接受,使ViewModelLocatorstatic。爲了嘗試一下,我做了一個快速切換到staticViewModelLocator。在我MainWindow.xaml,我設置DataContext到:

DataContext="{Binding Source={x:Static vm:ViewModelLocator.Main}}" 

...並回到第一個例子,我可以使用:

private void SomeMethod() 
{ 
    ViewModelLocator.OtherViewModel.SomeProperty = something; 
} 

和:

public ViewModelBase CurrentViewModel { get; set; } 

private void SomeMethod() 
{ 
    CurrentViewModel = ViewModelLocator.SomeViewModel; 
} 

目前該程序使用staticViewModelLocator可以正常工作,但它還處於初期階段,所以我想知道這是否是未來可行的選擇,或者我應該遠離一共有staticViewModelLocator

任何意見或對這些問題的意見將不勝感激。我對編程還很陌生,我想學習從長遠來看能爲我提供良好服務的技術。

如果我在這裏做的事情沒有明顯的問題,請讓我知道。

謝謝。

回答

1

從視圖模型中引用其他視圖模型被認爲是不正確的。這打破了應該讓你的項目更具可測性和可維護性的解耦。如果我需要從多個視圖模型中訪問屬性,我創建一個服務,如iUniversalAppDataService,然後使用內置於MVVM-Light中的依賴注入來解析何時創建vewimodel。

即這是您的視圖模型的構造:

public New(IUniversalAppDataService AppDataService) 
{ 
    _MyAppDataService = AppDataService; 
} 

這樣,任何更改/該服務中的屬性可用於實現該服務的任何視圖模型。

服務需要在viewmodellocator聲明爲好:

SimpleIoc.Default.Register<IUniversalAppDataService , UniversalAppDataService > 

我已經使用這個方法來創建用戶導航和從數據庫或網絡數據服務過程中的數據服務響應的導航服務。我強烈建議使用這種服務方法,因爲如果您的基礎數據模型或應用程序體系結構發生變化,從長遠來看,維護更容易。

相關問題