使用MVVMLight在ViewModels之间传递参数

Was*_*RAR 5 c# silverlight mvvm-light viewmodellocator windows-phone-8.1

我在使用MVVMLight框架中的Messenger类在我的ViewModel之间传递参数时遇到问题.

这是我正在使用的代码:

ViewModelLocator

public ViewModelLocator ()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    SimpleIoc.Default.Register<INavigationService, NavigationService>();

    SimpleIoc.Default.Register(() => new MainViewModel(NavigationService));
    SimpleIoc.Default.Register(() => new SecondViewModel(NavigationService));
}

public MainViewModel MainViewModel
{
    get { return SimpleIoc.Default.GetInstance<MainViewModel>(); }
}

public SecondViewModel SecondViewModel
{
    get { return SimpleIoc.Default.GetInstance<SecondViewModel>(); }
}

public INavigationService NavigationService
{
    get { return SimpleIoc.Default.GetInstance<INavigationService>(); }
}
Run Code Online (Sandbox Code Playgroud)

MainViewModel

private void ShowPersonDetailsCommand(object obj)
{
    Messenger.Default.Send((Person)obj);
    _navigationService.NavigateTo(new Uri("/SecondPage.xaml", UriKind.Relative))
}
Run Code Online (Sandbox Code Playgroud)

SecondViewModel

public SecondViewModel(INavigationService navigationService)
{
    _navigationService = navigationService;

    Messenger.Default.Register<Person>(
        this,
        person =>
        {
            Person = person;
        });
}
Run Code Online (Sandbox Code Playgroud)

在我的MainViewModel(ShowPersonDetailsCommand)中,我正在导航到SecondPage并在Messenger类中将一个人作为参数发送.此时,该人构造良好并作为消息发送.

但在SecondViewModel构造函数中,该人是null :(

有什么我想念的吗?

我认为我做错了什么......

供您参考 :

  • Windows Phone 8.1(Silverlight)

  • MVVMLight 5.0.2

  • Visual Studio 2013 Update 4

Sri*_*har 8

我建议SecondViewModel一旦注册就立即创建ViewModelLocator.你可以通过使用重载方法来实现Register.

SimpleIoc.Default.Register<SecondViewModel>(true);
Run Code Online (Sandbox Code Playgroud)

这将确保确保Messenger在发送消息之前进行注册.