Создание нескольких ВМ при использовании 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();