
如果用户点击按钮,我想导航到一个新的视图.当然,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或其他位置?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)