【问题标题】:How to use MVVM-Light with IMessenger to pass a value between 2 VMs in WIndows 8.1如何使用 MVVM-Light 和 IMessenger 在 WIndows 8.1 中的 2 个 VM 之间传递值
【发布时间】:2014-06-19 16:03:49
【问题描述】:

我必须单击两次才能在我的信使中接收消息我做错了什么?我认为我没有正确启动 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...

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

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

这是我的第二个虚拟机,应该会收到消息页面:

        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 的新手... 感谢您的帮助! 如果您需要更多代码,请联系我们!

【问题讨论】:

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


    【解决方案1】:

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

    顺便说一句:如果您有更好的导航方式或我可以在此代码中进行的改进,我会全力以赴! 谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 2018-05-18
      • 2016-01-08
      相关资源
      最近更新 更多