silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了mvvm – 导航逻辑属于哪个,View,ViewModel或其他位置?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我在视图中的一个按钮,绑定到ViewModel的ICommand属性(实际上是来自mvvv-light的RelayCommand) 如果用户点击按钮,我想导航到一个新的视图.当然,Navigationservice是View的一部分,而不是ViewModel.这意味着导航是视图的责任?但是在我的情况下,当按钮被点击时,我将会看到的视图取决于很多因素,包括登录用户是谁,数据库所在的状态等等.当然,V
我在视图中的一个按钮,绑定到viewmodel的ICommand属性(实际上是来自mvvv-light的RelayCommand)

如果用户点击按钮,我想导航到一个新的视图.当然,Navigationservice是View的一部分,而不是viewmodel.这意味着导航是视图的责任?但是在我的情况下,当按钮被点击时,我将会看到的视图取决于很多因素,包括登录用户是谁,数据库所在的状态等等.当然,View不应该需要所有那个信息.

执行Navigationservice.Navigate调用的首选选项是什么?

解决方法

如果您已经在使用MVVM Light,则可以使用包含的消息总线.所以你把你的按钮绑定到视图模型上的RelayCommand,就像你已经说过的那样.在您的RelayCommand的处理程序中,您可以决定导航到哪个视图.这将保留视图模型中的所有逻辑.

一旦您的命令处理程序决定了哪个视图导航,它可以在消息总线上发布消息.您的视图将侦听该消息,然后使用Navigationservice实际执行导航.所以除了等待被告知在某个地方进行导航,然后导航到被告知的地方,它不会做任何事情.

我一直在这样做,定义一个我的视图模型可以发布的Navigationmessage类,以及一个视图基类,我的视图从其中继承包含侦听器. Navigationmessage如下所示:

public class Navigationmessage : Notificationmessage
{
    public String Pagename
    {
        get { return base.Notification; }
    }

    public Dictionary<String,String> QueryStringParams { get; private set; }

    public Navigationmessage(String pageName) : base(pageName) { }

    public Navigationmessage(String pagename,Dictionary<String,String> queryStringParams) : this(pageName)
    {
        QueryStringParams = queryStringParams;
    }
}

这允许简单地传递页面名称,或者可选地还包括任何必需的查询字符串参数.一个RelayCommand处理程序会发布这样的消息:

private void RelayCommandHandler()
{
    //Logic for determining next view,then ...
    Messenger.Default.Send(new Navigationmessage("ViewToNavigate"));
}

最后,视图基类如下所示:

public class BasePage : PhoneApplicationPage
{
    public BasePage()
    {
        Messenger.Default.Register<Navigationmessage>(this,NavigateToPagE);
    }

    protected void NavigateToPage(Navigationmessage messagE)
    {
        //GetQueryString isn't shown,but is simply a Helper method for formatTing the query String from the Dictionary
        String queryStringParams = message.QueryStringParams == null ? "" : GetQueryString(messagE);

        String uri = String.Format("/Views/{0}.xaml{1}",message.Pagename,queryStringParams);
        Navigationservice.Navigate(new Uri(uri,UriKind.RelativE));
    }
}

这是一个约定,其中所有的视图都在应用程序根目录中的“Views”文件夹中.这对@R_180_9616@程序工作正常,但当然这可以扩展到支持不同的方案来组织您的视图.

大佬总结

以上是大佬教程为你收集整理的mvvm – 导航逻辑属于哪个,View,ViewModel或其他位置?全部内容,希望文章能够帮你解决mvvm – 导航逻辑属于哪个,View,ViewModel或其他位置?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。