如何使用MVVM执行查看导航?赢Rt



我已经按照MVVM模式启动了一个Windows Universal Project,并进入了我需要使用按钮单击到另一个页面的情况。

通常,我会使用按钮的单击事件在后面的代码中执行此操作:

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

但是,由于我需要使用此应用程序遵循MVVM模式,因此我想知道如何将导航设置为单击按钮的新视图?

在Google搜索之后,我在WPF解决方案中遇到了ICommand,但在此Windows Universal Framework中应该如何实现它。

基本上您有两个选项

1。使用导航服务

您可以定义INavigationService接口,并将其传递给ViewModel组件中的所有ViewModels(假设您使用的是不同的组件,这对于确保您不从ViewModel引用视图,因此违反MVVM模式很重要)。

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

在您的ViewModels中,您只需使用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,因此完全避免了后面的代码。

为此,混合提供了交互性触发和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>

混合行为/交互触发器通常用于将导航功能绑定到按钮或其他UI元素(即单击不必是按钮的图片),因为它不需要后面的代码中的任何代码或ViewModel。

如果在进行验证后要进行导航,即您有一个多页表格用于用户注册,并且您将"发送"按钮绑定到RegisterCommand,并且RegisterCommand进行在线验证,您需要去返回上一页,您需要使用INavigationService

相关内容

  • 没有找到相关文章

最新更新