如何使用 MVVM 执行视图导航?赢RT

How to perform View navigation using MVVM? Win RT

我已经按照 MVVM 模式启动了一个 Windows 通用项目,遇到了需要单击按钮导航到另一个页面的情况。

通常我会在代码后面使用按钮的点击事件来执行此操作,如下所示:

        private void AppBarButton_Click(object sender, RoutedEventArgs e)
        {
            // Navigation Without parameters
            this.Frame.Navigate(typeof(SecondPage));

        }

但是由于我需要在这个应用中遵循 MVVM 模式,我想知道我应该如何设置导航到按钮点击时的新视图?

我在 Google 搜索后在 WPF 解决方案中遇到了用于此任务的 ICommand,但对于如何针对此 Windows 通用框架实施它还不是 100%。

基本上你有两个选择

1.使用导航服务

您可以定义一个 INavigationService 接口并将其传递给视图模型程序集中的所有 ViewModel(假设您使用的是不同的程序集,这对于确保您没有引用视图模型中的视图很重要,并且因此违反了 MVVM 模式)。

public interface INavigationService
{
    void Navigate(string page, object parameter);
}

在您的视图模型中,您可以简单地用 navigationService.Navigate("UserEditPage", selectedUser.Id); 调用它。

实施可以像

一样简单
public class WinRtNavigationService : INavigationService 
{
    public void Navigate(string page, object parameter) 
    {
        Type pageType = Type.GetType(string.Format("YourCompany.YourApp.ViewModels.{0}", page));
        ((Frame)Window.Current.Content).Navigate(pageType, parameter);
    }
}

如果您需要从 ViewModels 导航,请使用它。

2。使用行为

您可以使用行为直接向 XAML 添加可重用的导航支持,从而完全避免代码隐藏。

为此,Blend 提供了交互触发器和 NavigateToPageAction 行为。

<Page 
    xmlns:i="using:Microsoft.Xaml.Interactivity"
    xmlns:c="using:Microsoft.Xaml.Interactions.Core" >
    ....
    <Button Content="Edit">
        <i:Interaction.Behaviors>
            <i:BehaviorCollection>
                <c:EventTriggerBehavior EventName="Tapped">
                    <c:NavigateToPageAction TargetPage="YourCompany.YourApp.ViewModel.UserEditPage" Parameter="{Binding Path=SelectedUser.Id}" />
                </c:EventTriggerBehavior>
            </i:BehaviorCollection>

        </i:Interaction.Behaviors>
    </Button>
    ...
</Page>

Blend Behaviors/Interaction 触发器通常用于将导航功能绑定到按钮或其他 UI 元素(即点击不一定是按钮的图片),因为它不是不需要代码隐藏或 ViewModel 中的任何代码。

如果在某些验证后进行导航,即您有一个用于用户注册的多页表单,并且您有一个绑定到 RegisterCommand 和 [=16= 的 "Send" 按钮] 进行在线验证并且您需要返回上一页,您会想要使用 INavigationService