如何使用MVVM-Light和IMessage在WIndows 8.1中的2个VM之间传递值

时间:2014-06-18 15:03:42

标签: c# windows-8 mvvm-light windows-8.1 win-universal-app

我必须点击两次才能在我的信使中收到一条消息我做错了什么?我是不是正确启动了Messenger?我认为?

在我的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...

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

 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的新手...... 谢谢您帮忙! 如果您需要更多代码请求!

1 个答案:

答案 0 :(得分:0)

问题来自我的导航类,我需要初始化我的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