如何在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的新手…谢谢你的帮助!如果你需要更多的代码,尽管问吧!
问题来自我的导航类,我需要初始化我的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