2012-02-17 59 views
0

关闭视图我有一个观点,让我们把它叫做“NestedView”,这是由于缺乏XAML嵌套区域支持定义嵌套区域,创建在用户控件构造一个观点是这样的:包含地区

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

'NestedView'显示(添加)到某个区域,我们称其为'MainRegion',有时需要关闭此视图(将其从'MainRegion'中移除)。但是,如果我只是从'MainRegion'中删除'NestedView',那么它已经注册'MyRegionName'的区域将保持注册状态,并且下一次我将尝试打开'NestedView'时,它会抛出区域'MeregionName'已经注册的异常。

所以我需要确保当我关闭包含区域的视图时,它们是未注册的,并且它们包含的所有视图都被放置。做这个的最好方式是什么?

回答

0

我的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出来了,他们要求解决这个问题。