2012-07-14 102 views
3

我有兩個ViewModel:MainViewModel和QuestionViewModel。我在ViewModelLocator中註冊它們。ViewModel在MVVM Light中沒有收到消息

SimpleIoc.Default.Register<MainViewModel>(); 
SimpleIoc.Default.Register<QuestionViewModel>(); 

On MainViewModel我有一個ListBox的問題。當點擊我執行此命令時

NavigationService.NavigateTo(new Uri("/Pages/QuestionPage.xaml", UriKind.Relative)); 
Messenger.Default.Send<Question, QuestionViewModel>(q); 

QuestionPage的DataContext設置爲QuestionViewModel。在QuestionViewModel我註冊消息:

Messenger.Default.Register<Question>(this, q => 
{ 
    MessageBox.Show("!"); 
}); 

不過這個功能對QuestionViewModel的第二隻開放工作,因爲QuestionViewModel實例都僅在第一開口造成的。我的問題是:何時何地需要在MVVM Light中創建QuestionViewModel的實例?我不想在啓動時創建我的所有頁面。現在

,我在構造函數中ViewModelLocator創建實例:

public ViewModelLocator() 
{ 
    ServiceLocator.Current.GetInstance<QuestionViewModel>(); 
} 

這是很好的做法?

回答

3

你是對的,在ViewModelLocator構造函數中創建所有視圖模型並不是一個好習慣。您得到的問題的原因是您發送郵件後創建了QuestionViewModel。您可以嘗試創建一個服務,該服務將共享當前的Question對象並將此服務注入MainViewModelQuestionViewModel

public interface IQuestionService 
{ 
    Question CurrentQuestion {get; set;} 
} 

public class QuestionService : IQuestionService 
{ 
    public Question CurrentQuestion {get; set;} 
} 

然後在MainViewModelClick只保存當前的問題:

_questionService.CurrentQuestion = q; 

,並使用在你QuestionViewModel

只要確保你注入IQuestionService的同一個實例爲您的視圖模型。

一個多種變異是通過簡單的導航參數在這樣的URL:

NavigationService.NavigateTo(new Uri("/Pages/QuestionPage.xaml?questionid=" + q.Id, UriKind.Relative)); 

或者,你可以嘗試實現自己的NavigationService支持傳遞參數,但是這是比較複雜的。

相關問題