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方法被触发。问题出在哪里?

最好托马斯

WP8 和 Win8 中的 Messanger 差异

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项目中。