軟件環境:windows phone 7.1
硬件環境:lumia 800
框架:mvvmlight
問題描述:
A頁面為數據列表頁面,B頁面為數據detail頁面,點擊A頁面的某一數據項跳轉到B頁面,同時需要將數據項的ID轉遞給B頁面,這樣B頁面可以獲取相應的細節數據。
這里不討論普通的傳遞方式,用mvvmlight的話 操作流程如下:
在A頁面的listbox里添加TapCommand
-
<i:Interaction.Triggers> <i:EventTrigger EventName="Tap"> <cmd:EventToCommand Command="{Binding TapMailCommand}" CommandParameter="{Binding SelectedItem,ElementName=lstInbox}"/> </i:EventTrigger> </i:Interaction.Triggers>
這樣在A頁面的viewModel里注冊此TapCommand事件到方法中,因為viewModel看不到view,所以需要發送一個uri消息並將點擊到的id信息隨同uri一起通過Messenger發送給A頁面的code-behind頁面。
-
privatevoid NavigatedToReadMail(string sMailId) { Messenger.Default.Send<string>(@"/Ui/ReadDoumail.xaml?MailId="+ sMailId, "Navigate"); }
在A頁面的code-behind里接收
protectedoverridevoid OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { Messenger.Default.Register<string>(this, "Navigate", uri => { if (uri !=null) { NavigationService.Navigate(new Uri(uri, UriKind.Relative)); } } ); base.OnNavigatedTo(e); }
這樣即實現了跳轉到B頁面,同時,在B頁面中接收uri及隨同的id消息
protectedoverridevoid OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { string sMailId =string.Empty; NavigationContext.QueryString.TryGetValue("MailId",out sMailId);
ViewModelLocator.DoumailStatic.GetMail(sMailId);
base.OnNavigatedTo(e); }
我的疑問在此,原來的思路是將NavigationContext獲取到的信息綁定到B頁面的某個控件中,並通過B頁面的某個帶參數的command事件將獲取到的信息傳遞給到B頁面的viewModel中並綁定B頁面的某個方法中更新B頁面的UI。 后來朋友告訴我直接用紅色的語句實現,我總覺得這樣看起來有點怪怪的,這樣有破壞mvvm的原則么? 忘了在哪里看過有文章說盡量不在code-behind中寫邏輯?可我覺得有時候不用code-behind會太憋屈。 請大家一起討論一下關於mvvm中的消息模式應該如何考慮。