Закрыть представление, содержащее регионы - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть представление, давайте назовем его «NestedView», который определяет вложенную область, из-за отсутствия поддержки вложенной области в XAML. Я создаю представление в конструкторе UserControl следующим образом:

RegionManager.SetRegionName(RegionControl, "MyRegionName");
RegionManager.SetRegionManager(RegionControl, _globalRegionManager);

«NestedView» отображается (добавляется) в каком-то регионе, назовем его «MainRegion», иногда мне нужно закрыть это представление (удалить его из «MainRegion»). Но если я просто удалю «NestedView» из «MainRegion», регион, в котором он зарегистрирован, «MyRegionName» останется зарегистрированным, и в следующий раз, когда я попытаюсь открыть «NestedView», он выдаст исключение, что регион «MeregionName» уже зарегистрирован.

Поэтому мне нужно убедиться, что при закрытии вида, содержащего регионы, они не регистрируются, и все содержащиеся в них виды удаляются. Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 18 февраля 2012

Я придумал этот метод в NavigationService:

public interface IRegionContainer
{
    IEnumerable<String> RegionNames { get; }
}

    public void RequestClose(string regionName, string viewContract)
    {
        ContainerRegistration registration = _unityContainer.Registrations.SingleOrDefault(t => t.Name == viewContract);
        if (registration == null) throw new Exception("ViewContract is not registered");
        IEnumerable<object> candidateViews = _regionManager.Regions[regionName].Views.Where(t => t.GetType() == registration.MappedToType);
        foreach (object viewInstance in candidateViews)
        {
            var regionContainer = viewInstance as IRegionContainer;
            if (regionContainer != null) //View defines regions?
            {
                foreach (string rName in regionContainer.RegionNames)
                {
                    var success = _regionManager.Regions.Remove(rName);
                    if (success == false) throw new Exception("Can't remove region: " + rName);
                }
            }
            _regionManager.Regions[regionName].Remove(viewInstance);
        }
    }

Также отсутствует PRISM 4.1, и они утверждают, что решили эту проблему.

...