2015-11-13 63 views
1

我是MVVM的新手,所以我很抱歉如果這是個問題有一個簡單的答案,但我一直無法通過搜索Google來清除它。MVVM Light:關於提取RelayCommand導航參數

因此,基本上,我使用MVVM Light製作Windows 10通用應用程序。使用ViewModelLocator的方法導航,它工作正常。我的問題是關於伴隨的參數。我有以下導航方法:

public RelayCommand<SelectionChangedEventArgs> SelectedItemCommand 
    { 
     get 
     { 
      return _selectedItemCommand 
      ?? (_selectedItemCommand = new RelayCommand<SelectionChangedEventArgs>(
       p => _navigationService.NavigateTo(ViewModelLocator.SecondPageKey, p))); 

     } 
    } 

我進入第二頁。但是,如何在目標頁面上提取此?到目前爲止,我已經想通

  1. 此參數進入目標頁面的視圖,然後我就可以傳遞給視圖模型的的OnNavigatedTo方法。但是這似乎與MVVM的內容並不一致。我什至不OnNavigatedTo在我的第二頁,它加載得很好。

  2. 另一種方法是使用MVVMLight的Messenger方法在第二頁的虛擬機中獲取它,這看起來更清晰。但是,如果這是唯一正確的方法,那麼在RelayCommand中傳遞參數有什麼意義呢?

我是否缺少某種第三種技術?我很想在這方面學習一些東西。感謝預期。

回答

1

您可以構建和使用自己的NavigationService。或改進當前之一:

創建BindablePage,它從Page繼承。裏面是:

public class BindablePage : Page 
{ 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 

     var navigableViewModel = this.DataContext as INavigable; 
     if (navigableViewModel != null) 
      navigableViewModel.OnNavigatedTo(e); 
    } 

    protected override void OnNavigatedFrom(NavigationEventArgs e) 
    { 
     base.OnNavigatedFrom(e); 

     var navigableViewModel = this.DataContext as INavigable; 
     if (navigableViewModel != null) 
      navigableViewModel.OnNavigatedFrom(e); 
    } 

    protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
    { 
     base.OnNavigatingFrom(e); 

     var navigableViewModel = this.DataContext as INavigable; 
     if (navigableViewModel != null) 
      navigableViewModel.OnNavigatingFrom(e); 
    } 

} 

創建INavigable:

public interface INavigable 
{ 
    void OnNavigatedTo(NavigationEventArgs e); 
    void OnNavigatedFrom(NavigationEventArgs e); 
    void OnNavigatingFrom(NavigatingCancelEventArgs e); 
    bool AllowGoBack(); 
} 

在你的視圖模型實現INavigable,你會處理的OnNavigatedTo您的視圖模型,即有機會獲得你發送P參數內。

+0

太棒了。我會試試這個,謝謝。 –