ViewModel在MVVM Light中不接收消息

我有两个ViewModel:MainViewModel和QuestionViewModel。 我在ViewModelLocator中注册它们。

SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); 

在MainViewModel上,我有一个带有问题的ListBox。 单击时执行此命令

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

QuestionPage的DataContext设置为QuestionViewModel。 在QuestionViewModel上我注册消息:

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

但是这个函数仅在第二次打开QuestionViewModel时起作用,因为QuestionViewModel实例仅在第一次打开时创建。 我的问题是:何时何地需要在MVVM Light中创建QuestionViewModel的实例? 我不想在启动时创建我的所有页面。

现在,我在构造函数ViewModelLocator中创建实例:

 public ViewModelLocator() { ServiceLocator.Current.GetInstance(); } 

这是好习惯吗?

你是对的,在ViewModelLocator构造函数中创建所有视图模型不是一个好习惯。 您遇到问题的原因是在发送消息后创建了QuestionViewModel 。 您可以尝试创建一个服务,该服务将共享当前的Question对象并将此服务注入MainViewModelQuestionViewModel

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

然后Click MainViewModel Click ,只保存当前问题:

 _questionService.CurrentQuestion = q; 

并在您的QuestionViewModel

只需确保将相同的IQuestionService实例注入视图模型。

另一个变体是在URL中传递简单的导航参数,如下所示:

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

或者,您可以尝试实现自己的支持传递参数的NavigationService,但这更复杂。