如何使用 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
。
我已经按照 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
。