Как вернуться к предыдущему виду в Caliburn Micro WPF? - PullRequest
0 голосов
/ 17 апреля 2020

Я новичок в платформе Caliburn Micro и работаю над приложением, имеющим представление списка, которое можно дважды щелкнуть по элементу, чтобы перейти к подробному представлению.

Это все работает нормально, и в настоящее время я выполняю прямую навигацию, отправляя сообщения ChangePage, которые SHellView берет и выдает команду ActivateItem для новой страницы.

Что я не могу понять, так это как перейти обратно на страницу и сохранить его состояние, в котором он был, когда вы его оставили? Я читал о коллекции Conductor, но не совсем уверен, как она работает на практике?

Есть ли у кого-нибудь пример, когда они отправляют сообщения ChangePage с помощью eventAggregator, и он обрабатывается 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
            }
        }

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете, например, сохранить модели посещенных видов в списке или словаре в ShellViewModel и просто проверить, существует ли экземпляр типа message._viewModelType в этой коллекции, когда вы получаете событие ChangePageMessage.

Если он существует, вы возвращаете этот экземпляр. Если нет, то вы создаете новый экземпляр, добавляете его в список или словарь и возвращаете этот экземпляр. Как то так:

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