我有一个简单的问题,为什么在这两个平台上我的代码以不同的方式工作。
在第一步中,我发送一条消息,使用命令绑定到来自MainViewModel
的UI中的按钮。
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在平台之间共享代码。
在第三步中,我想解雇Load方法,简单:
private void Load(Set set)
{
Load(set, 1);
}
在Windows应用商店项目中,一切都按预期工作,但在Windows Phone项目中,Load
方法不是第一次,只是在第二次。所以我必须去QuestionView
- 没有,回去再进入,现在一切正常。 Load
方法被触发。
有什么问题?
最佳, 托马斯
答案 0 :(得分:1)
ViewModel
后面的QuestionView
可能尚未实例化,因此无法接收消息。只有在转到QuestionView
后ViewModel
才会实例化(ViewModelLocator
)。如果您要向QuestionViewModel
发送消息,您应该立即在ViewModelLocator
中实例化它:
SimpleIoc.Default.Register<QuestionViewModel>(true);
我希望这有帮助。
答案 1 :(得分:1)
这是我发现有用的解决方案:
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>();
}
此解决方案相当不错,View中没有代码隐藏,ViewModel的所有功能都存储在PCL
项目中。