Глубокая навигация в Prism с помощью MasterDetailPage вызывает двойной вызов viewmodel

#c# #xamarin #navigation #xamarin.forms #prism

#c# #xamarin #навигация #xamarin.forms #prism

Вопрос:

У меня есть MasterDetailPage с кнопкой burger. Для этого я создаю этот путь навигации:

 var navigationStack = new Uri("https://Necessary/"   $"{nameof(ProfilePage)}/{nameof(NavigationBarPage)}/{nameof(DetailPage)}", UriKind.Absolute);  
await _navigationService.NavigateAsync(navigationStack, parameters, animated: false);
 

ProfilePage — MasterDetailPage, NavigationBarPage — NavigationPage

Но я понял, что из-за этого viewmodels вызывает два раза, один для ProfilePage, что приводит к вызову DetailPageViewModel и Master .. и всех дочерних элементов Detail, потому что это страница с вкладками. А затем, когда path переходит на DetailPage, он еще раз вызывает свои дочерние элементы.
Для меня это плохое поведение. Я делаю что-то не так? И как я могу избежать этого при том же виде моей страницы?

Если это будет {nameof(ProfilePage)}/ {nameof(NavigationBarPage)}, это будет выглядеть не так, как я хочу, потому что панель инструментов скроет часть главной страницы.

Комментарии:

1. Вам необходимо прояснить проблему. На самом деле, в чем именно проблема? Что означает «вызывает вызов DetailPageViewModel» или «он вызывает своих дочерних элементов»? Не могли бы вы объяснить немного более четко?

2. Посмотрите на путь навигации, который у меня есть. Он имеет ProfilePage, то есть MasterDetailPage, и в качестве его детали является DetailPage . Итак, поскольку он выполняется первым, DetailPage и его viewmodel выполняются здесь, а затем, в конце пути, у него есть DetailPage, эта viewmodel была запущена в ProfilePage, выполняется еще раз. Но я не хочу, чтобы это было два раза. Я понимаю, что это правильное поведение, но как я могу избежать этого, но с тем же результатом на дисплее? Я не нашел другого решения.

3. Что вы подразумеваете под «запуском». Виртуальная машина создается только один раз для каждой страницы.

4. Я имею в виду, что он создает и выполняет код, который находится в нем. Виртуальная машина создается при создании страницы, поэтому, поскольку в одном пути навигации у меня есть две одинаковые страницы (подробная страница ProfilePage — то есть DetailPage, и сама DetailPage), поэтому она создается два раза.

Ответ №1:

Основываясь на ваших комментариях, я могу только предположить, что когда вы определили свою MasterDetailPage, вы также определяете страницу DetailPage. Не делайте этого. Просто создайте свою MasterDetailPage с установленным основным свойством и не устанавливайте свойство Detail . Свойство Detail будет установлено автоматически при навигации с использованием пути глубокой ссылки.

Комментарии:

1. Это сработало. Я не знал, что я могу сделать с MDP подобным образом. Большое вам спасибо и извините, что отняли у вас время. Я люблю Prism 😉

2. Нет проблем, я рад, что смог помочь.