我已经按照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
。