视图模型不MVVM光接收消息(ViewModel doesn't receive messa

2019-09-19 11:38发布

我有两个的ViewModels: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光创建QuestionViewModel的实例? 我不想在启动时创建我的所有网页。

现在,我创建实例在构造ViewModelLocator:

public ViewModelLocator()
{
    ServiceLocator.Current.GetInstance<QuestionViewModel>();
}

这是很好的做法?

Answer 1:

你说得对,这不是一个很好的做法,建立在所有视图模型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的同一个实例为您的视图模型。

还有一个变种是通过简单的导航参数在这样的网址:

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

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



文章来源: ViewModel doesn't receive message in MVVM Light