我有两个ViewModel:MainViewModel和QuestionViewModel。我在ViewModelLocator中注册它们。
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<QuestionViewModel>();
在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>();
}
这是好习惯吗?
答案 0 :(得分:3)
你是对的,在ViewModelLocator
构造函数中创建所有视图模型不是一个好习惯。您遇到问题的原因是在发送邮件后创建了QuestionViewModel
。您可以尝试创建一个将共享当前Question
对象的服务,并将此服务注入MainViewModel
和QuestionViewModel
。
public interface IQuestionService
{
Question CurrentQuestion {get; set;}
}
public class QuestionService : IQuestionService
{
public Question CurrentQuestion {get; set;}
}
然后在Click
中MainViewModel
只保存当前问题:
_questionService.CurrentQuestion = q;
并在QuestionViewModel
只需确保将相同的IQuestionService实例注入视图模型。
另一个变体是在URL中传递简单的导航参数:
NavigationService.NavigateTo(new Uri("/Pages/QuestionPage.xaml?questionid=" + q.Id, UriKind.Relative));
或者,您可以尝试实现自己的支持传递参数的NavigationService,但这更复杂。