WP8 和 Win8 中的 Messanger 差异
本文关键字:Messanger 差异 中的 Win8 WP8 | 更新日期: 2023-09-27 17:55:48
我有一个简单的问题,为什么在这两个平台上我的代码以不同的方式工作。第一步,我使用绑定到 UI 中按钮的命令发送一条消息 MainViewModel
.
private RelayCommand<Set> _setCommand;
public RelayCommand<Set> SetCommand
{
get
{
return _setCommand
?? (_setCommand = new RelayCommand<Set>(
set =>
{
_navigationService.Navigate("QuestionView", set);
Messenger.Default.Send<Set, QuestionViewModel>(set);
}));
}
}
在第二步中,我在构造函数中注册消息QuestionViewModel
如下所示:
Messenger.Default.Register<Set>(this, Load);
在此解决方案中,我使用 PCL 在平台之间共享代码。
在第三步中,我想触发加载方法,很简单:
private void Load(Set set)
{
Load(set, 1);
}
在 Windows 应用商店项目中,一切都按我的预期工作,但在 Windows Phone 项目中,Load
方法不是在第一次触发,而是在第二次触发。所以我必须去QuestionView
——什么都没有,回去再进去,现在一切都在正常。 Load
方法被触发。问题出在哪里?
最好托马斯
QuestionView
后面的ViewModel
可能尚未实例化,因此无法接收消息。只有在QuestionView
之后,ViewModel
才会被实例化(由ViewModelLocator
)。如果要向QuestionViewModel
发送消息,则应立即在ViewModelLocator
中实例化它,如下所示:
SimpleIoc.Default.Register<QuestionViewModel>(true);
我希望这有所帮助。
这是我发现有用的解决方案: ViewModelLocator
#if NETFX_CORE //WINDOWS 8
SimpleIoc.Default.Register<QuestionViewModel>();
#else //WINDOWS_PHONE
SimpleIoc.Default.Register<QuestionViewModel>(true);
#endif
并在App.xaml.cs
中注册服务,如下所示:
public App()
{
SimpleIoc.Default.Register<IQuestionService, QuestionService>();
}
这个解决方案非常好,在视图中没有代码隐藏,视图模型的所有功能都存储在PCL
项目中。