如何在WIndows 8.1中使用MVVM-Light与IMessenger在2个虚拟机之间传递值

本文关键字:虚拟机 2个 之间 IMessenger WIndows MVVM-Light | 更新日期: 2023-09-27 18:09:15

我必须点击两次才能在我的信使中接收消息,我做错了什么?我认为我启动信使的方式不对吗?

在我的ViewModelLocator类:

 public class ViewModelLocator
    {
       static ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
            SimpleIoc.Default.Register<IPortabilityFactory, PortabilityFactory>();
            SimpleIoc.Default.Register<INavigationService, NavigationService>();
            SimpleIoc.Default.Register<IMessenger>((() => (IMessenger)new Messenger()));
            bla bla...
        }
bla bla...

在我的导航类中,我有:

    public class NavigationService : INavigationService
    {
        private IMessenger _messenger { get; set; }
        public NavigationService(IMessenger messenger)
        {
            _messenger = messenger;
        }
           bla bla...
public void NavigateToViewByChannelPage(Channel parameter)
            {
                //Sending info to ViewModel
                _messenger.Send(new IdParameter() { Id = parameter.Id }, typeof(ViewByChannelPageViewModel));
                //Going to page
                this.Navigate(typeof(ViewByChannelPage));
            }
bla bla...

这是我的第一个VM,它调用了NavigationService并将我导航到我的页面类:

 private void NavigateToChannel(Channel chan)
    {
        if (chan != null)
        {
            SimpleIoc.Default.GetInstance<INavigationService>().NavigateToViewByChannelPage(chan);
        }
    }

这是我的第二个VM,它应该接收消息页:

        public ViewByChannelPageViewModel(IMessenger messenger, IPortabilityFactory factory)
            : base(messenger)
        {
            _factory = factory;
            //Getting value passed
             messenger.Register<IdParameter>(this, typeof(ViewByChannelPageViewModel), message => UpdateContentPane(message.Id));
        }
        private async void UpdateContentPane(string videoId)
            {  
Bla bla....
    }

基本上我必须去两次相同的页面使信使第一次工作,然后一旦我完成了这个信使将完美地工作。
看来我得引荐信使了?以前有人遇到过这个问题吗?正如你所看到的,我是使用MVVM Light的新手…谢谢你的帮助!如果你需要更多的代码,尽管问吧!

如何在WIndows 8.1中使用MVVM-Light与IMessenger在2个虚拟机之间传递值

问题来自我的导航类,我需要初始化我的ViewByChannelPageViewModel之前,我可以传递一个值给它:

 public void NavigateToViewByChannelPage(Channel parameter)
        {
            //Must create an instance so that the page can recieve the info
Needed this -->  SimpleIoc.Default.GetInstance<ViewByChannelPageViewModel>();
            //Sending info to ViewModel
            _messenger.Send(new IdParameter() {Id = parameter.Id});
            //Going to page
            this.Navigate(typeof(ViewByChannelPage));
        }
顺便说一下:如果你有更好的导航方式或我可以在这段代码中做出的改进,我将洗耳恭听!Thx