mvvm – 导航逻辑属于哪个,View,ViewModel或其他位置?

mvvm – 导航逻辑属于哪个,View,ViewModel或其他位置?,第1张

概述我在视图中的一个按钮,绑定到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”文件夹中.这对我们的应用程序工作正常,但当然这可以扩展到支持不同的方案来组织您的视图.

总结

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1003539.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存