2014-03-31 25 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中,所以我應該註冊這些服務? –