Проблема навигации C # Prism

#c# #.net #navigation #prism

#c# #.net #навигация #prism

Вопрос:

У меня есть два региона. Область навигации и основная область.

Моя область навигации содержит две кнопки, которые вызывают метод RequestNavigate. Первая кнопка загружает представление без каких-либо параметров

 this.tRegionManager.RequestNavigate(RegionNames.MainRegion, ViewNames.VInfoMainViewUri);
  

Вторая кнопка должна загрузить тот же вид с некоторыми параметрами

   this.tRegionManager.RequestNavigate(RegionNames.MainRegion, new Uri(ViewNames.VInfoMainViewUri.OriginalString   ""   query.ToString(), UriKind.Relative));
  

Это работает нормально, если представление не загружено. Если загружено какое-либо представление, нажатие на любую кнопку ничего не приводит.

Я попытался удалить все активные представления из своего региона, но это приводит к ошибке

 IViewsCollection col = tRegionManager.Regions[args.RegionName].Views;
foreach (var obj in col)
{
   tRegionManager.Regions[args.RegionName].Remove(obj);

}
  

Область не содержит указанного представления.
Имя параметра: вид

Как я могу исправить эту проблему?

Ответ №1:

Если вы хотите создать новое представление, даже если в регионе уже существует представление того же типа, вам необходимо реализовать INavigationAware интерфейс либо в вашем представлении, либо в вашей ViewModel (Prism сначала проверит представление, и если оно не реализуется, INavigationAware оно также проверит ViewModel).

Вас конкретно интересует IsNavigationTarget метод, который сообщает Prism, следует ли повторно использовать текущий экземпляр представления или следует создать другой экземпляр для удовлетворения запроса навигации. Итак, чтобы всегда создавать новое представление, вы должны сделать:

 public class MyViewModel : INavigationAware {
    bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext)
    {
        return false;
    }

    void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
    {
    }
}
  

Все это более подробно объясняется в главе 8 документации Prism 4; в них также есть иллюстрация того, как это работает.