【问题标题】:How to navigate back to a previous view in Caliburn Micro WPF?如何导航回 Caliburn Micro WPF 中的上一个视图?
【发布时间】:2020-04-17 12:51:57
【问题描述】:

我是 Caliburn Micro 框架的新手,正在开发一个具有列表视图的应用程序,您可以双击一个项目以进入详细视图。

这一切都很好,我目前正在通过发送 ChangePage 消息进行前向导航,SHellView 会接收这些消息并为新页面发出 ActivateItem 命令。

我无法完全弄清楚的是如何导航回页面并保持它在您离开时的状态?我已经阅读了有关 Conductor 集合的信息,但不太确定它在实践中是如何工作的?

是否有人举例说明他们使用 eventAggregator 发送 ChangePage 消息,并由 ShellView 通过检查该页面是否已存在,如果不存在则创建一个新页面来处理?

谢谢!

更新:

我的更改页面消息如下所示:

public class ChangePageMessage
{
    public readonly Type _viewModelType;

    public ChangePageMessage(Type viewModelType)
    {
        _viewModelType = viewModelType;
    }
}

而我在 ShellView 中对消息的处理是:

public void Handle(ChangePageMessage message)
        {
            if (message._viewModelType == typeof(SearchResultsViewModel))
            {
                ActivateItem(new SearchResultsViewModel(_eventAggregator));
            }
            else if(message._viewModelType == typeof(DetailedDocumentViewModel))
            {
                ActivateItem(new DetailedDocumentViewModel(_eventAggregator));
            }
            else
            {
                //here
            }
        }

【问题讨论】:

  • 例如,您可以将访问过的视图模型存储在ShellViewModelList<T> 字段中,并在收到@987654326 时检查此列表中是否已存在T 类型的实例@ 事件。如果存在,则返回该实例。如果没有,则创建一个新实例,将其添加到列表中,然后返回此实例。您的事件类型是如何定义的?
  • 感谢您的建议!这是有道理的,我也更新了原始问题,以回应您关于如何定义我的事件的问题。

标签: wpf caliburn.micro


【解决方案1】:

例如,您可以将访问过的视图模型存储在ShellViewModel 的列表或字典中,并在收到ChangePageMessage 事件时检查此集合中是否已存在message._viewModelType 类型的实例。

如果存在,则返回该实例。如果没有,则创建一个新实例,将其添加到列表或字典中,然后返回此实例。像这样的:

private readonly Dictionary<Type, Screen> _viewModels = new Dictionary<Type, Screen>();

public void Handle(ChangePageMessage message)
{
    if (_viewModels.TryGetValue(message._viewModelType), out Screen viewModel))
    {
        ActivateItem(viewModel);
    }
    else if (message._viewModelType == typeof(SearchResultsViewModel))
    {
        var vm = new SearchResultsViewModel(_eventAggregator);
        _viewModels.Add(message._viewModelType, vm);
        ActivateItem(vm);
    }
    else if (message._viewModelType == typeof(DetailedDocumentViewModel))
    ...
}

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多