2014-03-31 19 views
0

我有一个简单的问题,为什么在这两个平台上我的代码工作方式不同。 在第一步中,我使用绑定到MainViewModel中UI中的按钮的命令发送消息。WP8和Win8中的Messanger差异

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方法firied不第一次,只有第二次。所以我必须去QuestionView--没什么,回去再进入,现在一切正常。 Load方法被解雇。 问题是什么?

最佳, 托马斯

回答

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>(); 
    } 

该解决方案是相当不错的无代码隐藏在视图和所有功能的ViewModels存储在PCL项目中。

1

背后QuestionViewViewModel很可能尚未实例化,因此不能接收消息。只有在去QuestionView之后,ViewModel才会被实例化(由ViewModelLocator)。如果你想将消息发送到QuestionViewModel你应该马上实例化它在ViewModelLocator这样的:

SimpleIoc.Default.Register<QuestionViewModel>(true); 

我希望这有助于。

+0

在此之后,我得到了一个TargetInvocationException关于我在'QuestionViewModel'中调用的一个服务'IQuestionService',我不能在ViewModelLocator中注册这个服务,因为Google说它是在PCL中,所以我应该注册这些服务? –