WP8和Win8中的Messenger差异

时间:2014-03-31 09:44:32

标签: c# windows-phone-8 windows-store-apps mvvm-light

我有一个简单的问题,为什么在这两个平台上我的代码以不同的方式工作。 在第一步中,我发送一条消息,使用命令绑定到来自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方法被触发。 有什么问题?

最佳, 托马斯

2 个答案:

答案 0 :(得分:1)

ViewModel后面的QuestionView可能尚未实例化,因此无法接收消息。只有在转到QuestionViewViewModel才会实例化(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项目中。