如何导航回到 Caliburn Micro WPF 中的上一个视图?

How to navigate back to a previous view in Caliburn Micro WPF?

我是 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
            }
        }

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

如果它存在,你return那个实例。如果没有,那么您创建一个新实例,将其添加到列表或字典中,然后 return 这个。像这样:

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