Silverlight 3 Beta,ViewModel中的NavigationService

时间:2009-06-24 08:02:26

标签: silverlight navigation prism viewmodel

我开发了一个silverlight 3 beta导航应用程序,所以我使用了MVVM模式:)(一体化视图模型),使用棱镜和其他东西。

问题:如何导航到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接口吗?

5 个答案:

答案 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));

上面应该有用。