C# ViewModel没有';在MVVM指示灯下无法接收消息
我有两个视图模型:MainViewModel和QuestionViewModel。我在ViewModelLocator中注册它们C# ViewModel没有';在MVVM指示灯下无法接收消息,c#,.net,windows-phone-7,mvvm,mvvm-light,C#,.net,Windows Phone 7,Mvvm,Mvvm Light,我有两个视图模型:MainViewModel和QuestionViewModel。我在ViewModelLocator中注册它们 SimpleIoc.Default.Register<MainViewModel>(); SimpleIoc.Default.Register<QuestionViewModel>(); simpleoc.Default.Register(); SimpleIoc.Default.Register(); 在MainViewModel上,我有
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<QuestionViewModel>();
simpleoc.Default.Register();
SimpleIoc.Default.Register();
在MainViewModel上,我有一个带有问题的列表框。单击时,我执行此命令
NavigationService.NavigateTo(new Uri("/Pages/QuestionPage.xaml", UriKind.Relative));
Messenger.Default.Send<Question, QuestionViewModel>(q);
NavigationService.NavigateTo(新Uri(“/Pages/QuestionPage.xaml”,UriKind.Relative));
Messenger.Default.Send(q);
QuestionPage的DataContext设置为QuestionViewModel。关于QuestionViewModel I注册消息:
Messenger.Default.Register<Question>(this, q =>
{
MessageBox.Show("!");
});
Messenger.Default.Register(这个,q=>
{
MessageBox.Show(“!”);
});
但此函数仅在QuestionViewModel的第二个打开中起作用,因为QuestionViewModel实例仅在第一个打开时创建。我的问题是:何时何地需要在MVVM灯光下创建QuestionViewModel实例?我不想在启动时创建所有页面
现在,我在构造函数ViewModelLocator中创建实例:
public ViewModelLocator()
{
ServiceLocator.Current.GetInstance<QuestionViewModel>();
}
公共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;}
}
然后在上单击MainViewModel
中的,只需保存当前问题:
_questionService.CurrentQuestion = q;
并在您的问题视图模型中使用
只需确保将相同的IQuestionService实例注入到视图模型中即可
另一种变体是在URL中传递简单的导航参数,如下所示:
NavigationService.NavigateTo(new Uri("/Pages/QuestionPage.xaml?questionid=" + q.Id, UriKind.Relative));
或者,您可以尝试实现自己的NavigationService,它支持传递参数,但这更复杂