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
对象并将此服务注入MainViewModel
和QuestionViewModel
。
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,但这更复杂。