Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ViewModel没有';在MVVM指示灯下无法接收消息_C#_.net_Windows Phone 7_Mvvm_Mvvm Light - Fatal编程技术网

C# ViewModel没有';在MVVM指示灯下无法接收消息

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上,我有

我有两个视图模型:MainViewModel和QuestionViewModel。我在ViewModelLocator中注册它们

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,它支持传递参数,但这更复杂