Создание нескольких ВМ при использовании Catel с Modern UI

Я люблю рамки Catel. Современный интерфейс выглядит довольно хорошо. Но я столкнулся с проблемой при попытке заставить их работать вместе.

Я добавил две catels usercontrols Home а также Second в проекте муй. Проблема в том, что при переходе от Home в Second выполнение HomeViewModel был создан 3 раза.

Такое поведение вызвано следующим кодом в TransitioningContentControl

    private void StartTransition(object oldContent, object newContent)
    {
        // both presenters must be available, otherwise a transition is useless.
        if (CurrentContentPresentationSite != null && PreviousContentPresentationSite != null) {
            CurrentContentPresentationSite.Content = newContent;

            PreviousContentPresentationSite.Content = oldContent;

            // and start a new transition
            if (!IsTransitioning || RestartTransitionOnContentChange) {
                IsTransitioning = true;
                VisualStateManager.GoToState(this, NormalState, false);
                VisualStateManager.GoToState(this, Transition, true);
            }
        }
    }

Если я прокомментирую несколько строк:

private void StartTransition(object oldContent, object newContent)
    {
        // both presenters must be available, otherwise a transition is useless.
        if (CurrentContentPresentationSite != null && PreviousContentPresentationSite != null) {
            CurrentContentPresentationSite.Content = newContent;

            //PreviousContentPresentationSite.Content = oldContent;

            // and start a new transition
            if (!IsTransitioning || RestartTransitionOnContentChange) {
                IsTransitioning = true;
                //VisualStateManager.GoToState(this, NormalState, false);
                //VisualStateManager.GoToState(this, Transition, true);
            }
        }
    }

Такой же переход в этом случае приводит к созданию HomeViewModel 1 раз, но я не хочу создавать HomeViewModel при выполнении навигации из Home контроль. Как мне этого добиться?

Проект по вкусу

1 ответ

Решение

Есть 2 возможных варианта решения этой проблемы:

1) Использовать существующую функцию (CloseViewModelOnUnloaded). Будет поддерживать ВМ во время перехода.

Тогда вам нужен этот код в TransitioningContentControl.StartTransition

var userControl = oldContent as Catel.Windows.Controls.UserControl;
if (userControl != null)
{
    userControl.CloseViewModelOnUnloaded = false;
}

PreviousContentPresentationSite.Content = oldContent;

Добавьте это к OnTransitionCompleted:

var userControl = PreviousContentPresentationSite.Content as Catel.Windows.Controls.UserControl;
if (userControl != null)
{
    userControl.CloseViewModelOnUnloaded = true;
    var vm = userControl.ViewModel;
    if (vm != null)
    {
        vm.CloseViewModel(true);
    }
}

AbortTransition();

2) Использование новой функции (PreventViewModelCreation) не будет поддерживать виртуальную машину во время перехода.

Тогда вам нужен этот код в TransitioningContentControl.StartTransition

var vmContainer = oldContent as IViewModelContainer;
if (vmContainer != null)
{
    vmContainer.PreventViewModelCreation = true;
}

PreviousContentPresentationSite.Content = oldContent;

Добавьте это к методу OnTransitionCompleted:

var vmContainer = PreviousContentPresentationSite.Content as IViewModelContainer;
if (vmContainer != null)
{
    vmContainer.PreventViewModelCreation = false;
}

AbortTransition();
Другие вопросы по тегам