2015-02-16 1 views
3

У меня есть приложение с тремя регионами. Регион A - это область навигации для хранения элементов навигации для модулей в приложении. Регионы B и C - это области содержимого для модулей. У меня также есть два модуля Module1 и Module2, каждый из которых имеет элемент управления навигационными элементами, загруженный в область A. Регион A содержит NavigationItemMod1Control и NavigationItemMod2Control.WPF Prism Подтверждение навигационного запроса для нескольких регионов

NavigationItemMod1Control привязан к команде, которая загружает view1B в область B и view1C в область C (NavigationItemMod2Control имеет аналогичную команду). Команда выполнения метода показано ниже:

public void Execute(object parameter) 
{ 
     // Show View 1B 
     var view1BUri = new Uri(Module1RegionNames.ViewBControl, UriKind.Relative); 
     regionManager.RequestNavigate(RegionNames.ViewBArea, view1BUri); 

     // Show View 1C 
     var view1CUri = new Uri(Module1RegionNames.ViewCControl, UriKind.Relative); 
     regionManager.RequestNavigate(RegionNames.ViewCArea, view1CUri); 
} 

Когда я нажимаю на NavigationItemMod2Control, я хочу, чтобы подтвердить навигацию перед загрузкой либо вид 2B или вид 2С в соответствующих регионах.

Я успешно реализовал IConfirmNavigationRequest в viewmodel для View1B в модуле 1, но это только контролирует навигацию для региона B. Если пользователь отменяет запрос на навигацию, область B корректно остается в виде View1B, но View2C загружается в область C .

Любые предложения о том, как подтвердить навигацию один раз для обоих регионов?

+0

Почему вы не можете реализовать 'IConfirmNavigationRequest' для viewmodel вашего' view1C'? – dymanoid

+0

@dymanoid Я рассматривал это, но я хотел бы управлять подтверждением навигации для всех представлений в Модуле 1 в одном месте – Tiggy

ответ

1

Запрос навигации поставляется с перегрузкой, которая поддерживает функцию обратного вызова:

var navigationParameters = new NavigationParameters(); 
        navigationParameters.Add("RelatieId", _CurrentRelatie.RelatieId); 
regionManager.RequestNavigate("RelatieDetailRegion", 
         new Uri("RelatieDetail", UriKind.Relative), NavigationCallback, navigationParameters); 

void NavigationCallback(NavigationResult nr) 
    { 
     _logger.Log("NavigationCallback", Category.Info, Priority.Medium); 
     if (nr.Result.Value == true) 
     { 

      //navigate region C, so this is your code 
      var view1CUri = new Uri(Module1RegionNames.ViewCControl, UriKind.Relative); 
      regionManager.RequestNavigate(RegionNames.ViewCArea, view1CUri); 
     } 
    } 

это основано на фрагменте кода шахты, вам придется немного подправить, например, не использовать navigationparameters, которые вы не используете.

+0

Спасибо - это решает мою непосредственную проблему. Есть ли способ обеспечить соблюдение этого шаблона? Другие разработчики скоро добавят больше модулей, и там будет нужна аналогичная логика. Я думал о создании базового командного класса, который принимает Uri s для ViewB и ViewC в любом модуле, а затем обрабатывает навигацию так, как вы предлагали. Это будет работать, но он полагается на всех, кто использует этот базовый класс для своих команд, которые в данный момент не являются обязательными. – Tiggy

+0

Пожалуйста, отметьте это как решение. –

Смежные вопросы