2012-02-17 61 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出來了,他們要求解決這個問題。