關於mvvm模式中消息傳遞的疑問


軟件環境: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中的消息模式應該如何考慮。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM