MVVM Light:关于提取RelayCommand导航参数

时间:2015-11-13 20:17:31

标签: c# windows-runtime winrt-xaml mvvm-light

我是MVVM的新手,所以如果这个问题有一个简单的答案我很抱歉,但我还没有能够通过搜索Google来解决这个问题。

所以,基本上,我使用MVVM Light制作Windows 10 Universal应用程序。使用ViewModelLocator的方法导航,它工作正常。我的问题是关于附带的参数。我有以下导航方法:

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

        }
    }

我转到第二页。但是如何在目标网页上提取 p 呢?到目前为止,我已经想到了

  1. 此参数进入目标网页视图的 OnNavigatedTo 方法,然后我可以将其传递给ViewModel。但这似乎与MVVM的内容不相符。我甚至没有在我的第二页 OnNavigatedTo ,它加载得很好。

  2. 另一种方法是使用MVVMLight的 Messenger 方法在第二页的VM中获取它,这看起来更干净。但如果这是唯一正确的方法,那么在RelayCommand中传递参数的重点是什么?

  3. 我错过了某种第三种技巧吗?我喜欢在这方面学到一些东西。谢谢你的期待。

1 个答案:

答案 0 :(得分:1)

您可以构建和使用自己的NavigationService。或者改进现有的:

创建继承自Page的BindablePage。在里面:

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);
    }

}

创建无法接收:

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

在您的Viewmodel中实现INAVigable,您将在viewmodel中处理OnNavigatedTo,它可以访问您发送的p参数。