问题:如何导航到viewmodel中的其他“NavigationPage”
现在简而言之,视图模型被声明为页面资源。
<navigation:Page.Resources>
<mvvm:LoginModel x:Key="DataSource" d:IsDataSource="True"></mvvm:LoginModel>
</navigation:Page.Resources>
然后使用命令将所有内容与viewmodel
连接起来<Button x:Name="LoginButton" Width="100" Margin="8" Content="Login"
prism:Click.Command="{Binding LoginCommand}"/>
现在,如果我尝试在视图模型中的任何位置导航,就像这样
this.NavigationService.Navigate(new Uri("/Views/About.xaml", UriKind.Relative));
导航服务为空,我环顾四周并发现了this文章,其中描述了使用螺旋线0.3进行导航,这是在sl2天内构建的,当导航控件从未存在时,现在螺旋模型正常工作好吧,通过在viewmodel中实现INavigationAware,您可以获得对NavigationContext的访问权限,然后执行您需要的任何操作,我已经尝试了螺旋,并且它可以工作。
SL3附带了内置的导航支持,可以说,它与Helix完全相同。所以我不想使用第三方框架,而是我更喜欢使用内置的sl3功能。
SL3中有什么可以模拟螺旋的INavigationAware接口吗?
答案 0 :(得分:4)
我个人认为NavigationService是一个与UI框架或页面相关联的UI概念。
在不必将NavigationService传递到视图模型的情况下实现此目的的另一种方法是让ViewModel在应该发生导航时引发事件...让视图处理视图模型事件并调用Navigate作为响应。
答案 1 :(得分:1)
一个狡猾的解决方案,但我唯一能够用来使这个工作。 在视图中的OnNavigatedTo事件中,访问ViewModel并将NavigationService设置为viewmodel中的属性,以便稍后可以在viewmodel中使用
protected override void OnNavigatedTo(NavigationEventArgs e)
{
ViewModels.LoginViewModel viewmodel = (ViewModels.LoginViewModel)this.Resources["DataSource"];
//DataSource being the x:Name given to the viewmodel that is loaded as a page resource
viewmodel .service = NavigationService;
}
答案 2 :(得分:1)
如果您使用的是MVVM灯,则可能需要考虑使用Messaging系统。在您的页面上有一个监听器,用于托管导航框架并从您的视图模型发送导航消息。
答案 3 :(得分:0)
好的,可以帮我解决问题,因为还没有任何答案,我会向它提供更多信息。
这是viewmodel中的代码
public LoginModel()
{
LoginCommand = new DelegateCommand<object>(LoginCommandExecuted, a => { return _CanLoginCommandExecute; });
}
public ICommand LoginCommand { get; private set; }
private bool _CanLoginCommandExecute = true;
private void LoginCommandExecuted(object parameter)
{
_CanLoginCommandExecute = false;
AdminClient client = new AdminClient();
client.AuthorizeAsync();
client.AuthorizeCompleted +=
new EventHandler<AsyncCompletedEventArgs>(
(s, e) =>
{
if (e.Error != null)
{
MessageBox.Show("Login Failed");
}
else
{
this.NavigationService.Navigate(new Uri("/Views/About.xaml", UriKind.Relative));
}
_CanLoginCommandExecute = true;
}
);
}
NavigationService为null,因此我无法转到下一个视图,帮助!!!
答案 4 :(得分:0)
NavigationService.Navigate(new Uri("/About", UriKind.Relative));
上面应该有用。