ViewModel在MVVM Light中不接收消息

时间:2012-07-14 17:34:29

标签: c# .net windows-phone-7 mvvm mvvm-light

我有两个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>();
}

这是好习惯吗?

1 个答案:

答案 0 :(得分:3)

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

public interface IQuestionService
{
    Question CurrentQuestion {get; set;}
}

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

然后在ClickMainViewModel只保存当前问题:

_questionService.CurrentQuestion = q;

并在QuestionViewModel

中使用

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

另一个变体是在URL中传递简单的导航参数:

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

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