Как создать новый вид каждый раз, когда навигация происходит в PRISM? - PullRequest
5 голосов
/ 25 февраля 2011

Я использую WPF4 и PRISM4 для моего нового проекта.

Существует один модуль с несколькими представлениями.DI делается с единством.Когда я впервые перехожу от ViewA к ViewB, создается ViewB и вызывается его конструктор.Но когда я пытаюсь перейти к ViewB во второй, третий раз, ViewB не создается, но существующий экземпляр используется повторно.

Я использую IRegionManager.RequestNavigate для своих целей навигации.

Я пытался передать TransientLifeTimeManager в RegisterType Методы Unity, но безрезультатно.

Есть ли способ настроить призму и / или единство для создания нового представления при каждом переходе к нему?

Спасибо.

Ответы [ 3 ]

19 голосов
/ 04 марта 2011

Правильный способ сделать это - реализовать INavigationAware в вашем View или в вашей ViewModel (Prism сначала проверит представление, а если он не реализует INavigationAware, то также проверит ViewModel).

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

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

    void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
    {
    }
}

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

16 голосов
/ 25 февраля 2011

Способ сделать это - реализовать IRegionMemberLifetime в вашем view или viewModel и вернуть false в логическое свойство KeepAlive следующим образом:

public class EmployeeDetailsViewModel : IRegionMemberLifetime
{
    public bool KeepAlive
    {
        get { return false; }
    }
}
1 голос
/ 25 февраля 2011

Внутренне ищет свойство View в ActiveViews региона.Если его там нет, он создает новый и добавляет его в ActiveViews для будущего использования.

Чтобы выполнить то, что вы хотите сделать, вам нужно будет удалить или очистить1007 * ActiveView коллекция перед переходом к любому представлению.

Пример:

public static class RegionManagerExtensions
{
    public static void RequestNavigateEx(this IRegionManager regionManager, String regionName, Uri source)
    {
        if (regionManager != null)
        {
            IRegion region = regionManager.Regions[regionName];

            if (region != null)
            {
                foreach (Object view in region.ActiveViews)
                {
                    region.Remove(view);
                }

                regionManager.RequestNavigate(regionName, source);
            }
        }
    }
}
...