gpt4 book ai didi

mvvm - 导航逻辑属于哪里,View、ViewModel 还是其他地方?

转载 作者:行者123 更新时间:2023-12-04 00:48:43 26 4
gpt4 key购买 nike

我是 View 中的一个按钮,绑定(bind)到 ViewModel 的 ICommand 属性(实际上它是来自 mvvv-light 的 RelayCommand)

如果用户单击我想导航到新 View 的按钮。当然 NavigationService 是 View 的一部分,而不是 ViewModel。这意味着导航是 View 的责任?但在我的情况下,单击按钮时我将要查看的 View 取决于很多因素,包括登录用户是谁、数据库所处的状态等……当然 View 不需要全部该信息。

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

最佳答案

如果您已经在使用 MVVM Light,则一种选择是使用它包含的消息总线。因此,您将按钮绑定(bind)到 View 模型上的 RelayCommand,正如您已经说过的那样。在 RelayCommand 的处理程序中,您可以决定导航到哪个 View 。这将所有逻辑保留在 View 模型中。

一旦您的命令处理程序决定导航到哪个 View ,它就可以在消息总线上发布消息。您的 View 将监听该消息,然后使用 NavigationService 实际执行导航。所以除了等待被告知导航到某个地方然后导航到它被告知的地方之外,它没有做任何事情。

我一直在通过定义我的 View 模型可以发布的 NavigationMessage 类和我的 View 继承的包含监听器的 View 基类来做到这一点。 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"));
}

最后, View 基类如下所示:

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));
}
}

这是假设所有 View 都位于应用程序根目录中的“ View ”文件夹中的约定。这适用于我们的应用程序,但当然可以扩展它以支持您如何组织 View 的不同场景。

关于mvvm - 导航逻辑属于哪里,View、ViewModel 还是其他地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3857486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com