2

我在 ViewModel 第一种方法中使用 Prism,即:

1)我在一个容器中注册了我的 ViewModel(在这种情况下是统一的)。

2)我DataTemplate为每个 vm 提供一个 (UserControl) 。

3) 我使用在 Container 注册的 ViewModel 名称进行导航。

    _regionManager.RequestNavigate(regionName, viewModelName, navigationCallBack);  

这很好用,但是当我尝试从该区域删除“视图”时,出现以下异常:

 The region does not contain the specified view. Parameter name: view

我尝试删除:

  var region = _regionManager.Regions[requests[i].RegionName];                                     
  var view = region.Views.Single(v => v.GetType().Name == requests[i].ViewName);
  region.Remove(view);   

ViewModel 位于“Views”集合中。知道什么是错的以及如何解决这个问题吗?

4

2 回答 2

2

如果 IRegionMemberLifetime.KeepAlive 返回 false,这将在每次视图导航到时创建一个新视图。如果返回 True,则保持该视图处于活动状态并在导航到时返回相同的视图。

使用 KeepAlive 返回 false 时无法删除视图的原因是,从技术上讲,在您调用删除视图时,该视图已被删除。您需要停用视图,而不是删除它。不用担心,由于 KeepAlive 返回 false,视图将从集合中删除并丢弃,您只是在告诉 UI 停用它。

var region = _regionManager.Regions[requests[i].RegionName];                                     
var view = region.Views.Single(v => v.GetType().Name == requests[i].ViewName);
region.Deactivate(view);   

只是重申-

  • KeepAlive 返回 False = region.Deactivate(view)
  • KeepAlive 返回 True = region.Remove(view)
于 2013-08-19T16:28:55.183 回答
2

感谢 TrialAndError 的回答,如果 KeepAlive 为假,我发现停用项目解决了我的问题,但是我们所有的类都是使用 KeepAlive 属性设置的,而不是通过实现 IRegionMemberLifetime 接口,这使得检查 KeepAlive 有点棘手。我想出了这个循环,我们用它来卸载一个区域的所有视图。我希望这可以帮助别人。这适用于 IRegionMemberLifetime 接口和 KeepAlive 设置为 false 的 RegionLifetimeAttribue。

 public static void RemoveAllViews(this IRegion region)
    {
        /*
          * If KeepAlive == false we must deactiveate rather than trying to remove it.
          * KeepAlive can be set by implementing IRegionMemberLifetime interface, or by setting the KeepAlive attribute, 
          * so we must check both. 
          * Use reflection to determine if the view has a KeepAlive attribute, and if it does, then is KeepAlive == false. 
          * 
         * */ 
        foreach (object view in region.Views)
        {
            Type type = view.GetType();
            if (null != Attribute.GetCustomAttribute(type, typeof(RegionMemberLifetimeAttribute)))
            {
                RegionMemberLifetimeAttribute attribute = (RegionMemberLifetimeAttribute)Attribute.GetCustomAttribute(type, typeof(RegionMemberLifetimeAttribute));
                if (attribute.KeepAlive == false)
                    region.Deactivate(view);
            }
            else if (view is IRegionMemberLifetime && !((IRegionMemberLifetime)view).KeepAlive)
            {
                region.Deactivate(view);
            } 
            else //This is not an item that has KeepAlive set to false so remove it
            {
                region.Remove(view); 
            } 
        }
    }
于 2015-12-30T15:26:32.727 回答