2015-11-13 66 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

太棒了。我会试试这个,谢谢。 –