我已经按照MVVM模式启动了一个Windows Universal项目,并且遇到了需要通过单击按钮导航到另一个页面的情况。
通常我会在代码后面使用按钮的点击事件,如下所示:
private void AppBarButton_Click(object sender, RoutedEventArgs e)
{
// Navigation Without parameters
this.Frame.Navigate(typeof(SecondPage));
}
但是由于我需要使用这个应用程序遵循MVVM模式,我想知道如何设置导航到按钮点击的新视图?
在Google搜索之后,我在WPF解决方案中遇到过ICommand这个任务,但不是100%关于如何为这个Windows Universal Framework实现它。
答案 0 :(得分:2)
基本上你有两个选择
<强> 1。使用导航服务
您可以定义INavigationService
接口并将其传递给viewmodel程序集中的所有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提供了Interactivity Triggers和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元素(即点击不必是按钮的图片),因为它不需要任何代码在Code Behind或ViewModel中。
如果在某些验证后要进行导航,即您有一个用户注册的多页表单,并且您有一个&#34;发送&#34;按键绑定到RegisterCommand
,RegisterCommand
进行在线验证,您需要返回上一页,您想要使用INavigationService
。