3

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

这是好习惯吗?

4

1 回答 1

3

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

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,但这更复杂。

于 2012-08-09T16:36:47.713 回答