1

我有一个在两个父视图之间共享的子视图(SharedView),所以我通过这样的区域将它添加到每个父视图

<StackPanel>
  <ContentControl cal:RegionManager.RegionName="SharedViewRegion" />
</StackPanel>

在父视图的 ViewModel 中,我像这样注册子视图

regionManager.RegisterViewWithRegion("SharedViewRegion", typeof(SharedView));

当我运行应用程序时,如果我只打开一个父视图,它会按预期工作,但如果我打开两个父视图,则会出现以下异常

创建名为“SecondRegion”的区域时发生异常。例外是:System.InvalidOperationException:指定元素已经是另一个元素的逻辑子元素。先断开它。

我一直在谷歌搜索,这是我发现的问题的更接近的解决方案InvalidOperationException 当同一个视图实例添加到多个 ContentControl 区域时发生

但我正在使用棱镜导航功能,所以我像这样实例化父视图

regionManager.RequestNavigate("ModuleRegion", new Uri("ParentView1", UriKind.Relative));

有人可以帮我解决这个问题吗?

4

2 回答 2

1

尝试执行以下操作:

向托管区域的 ContentControl 添加名称

现在您必须在离开父视图之前删除区域的内容,因此在 ViewModel 中将以下代码添加到 OnNavigatedFrom 方法

public void OnNavigatedFrom(NavigationContext navigationContext)
{
  ParentView.MyContentControl.Content = null;
}

注意:您可以访问将其导入 ViewModel 的父视图。

现在您需要手动将内容添加到该区域,因为您在离开该区域之前已将其删除。这是代码

public void OnNavigatedTo(NavigationContext navigationContext)
{
  SharedView view = (SharedView)ServiceLocator.Current.GetInstance(typeof(SharedView));
  ParentView.MyContentControl.Content = view;
}

注意:在此方法中,您必须添加一些解决方法,因为第一次打开此视图时,您将收到 System.InvalidOperationException,因为 PRISM 将尝试将 SharedView 添加到 MyContentControl。

这是一个可能的解决方法

bool isFirstTime = true;

public void OnNavigatedTo(NavigationContext navigationContext)
{
  if (isFirstTime)
  {
    isFirstTime = false;
    return;
  }
  SharedView view = (SharedView)ServiceLocator.Current.GetInstance(typeof(SharedView));
  ParentView.MyContentControl.Content = view;
}

您必须在共享 SharedView 的所有父视图中执行相同的工作

我希望这对你有帮助

于 2012-08-03T15:33:39.883 回答
0

对于这种情况,您应该直接将视图添加到区域而不是视图发现。为您的父视图赋予唯一的名称(您可以使用计数器来组成唯一的名称)。

var region = this.regionManager.Regions["SharedViewRegion"];
var viewName = string.Format("SharedView{0}", this.countParent+1);

//Only add if it doesn't exist
var view = region.GetView(viewName);
if (null==view)
{
 //Use container to get new instance of the parent view.
 view = this.container.Resolve<SharedView>();
 region.Add(view, name);
 //Increment the counter as you added a new parent view 
 this.countParent++;
}

//Now activate the view
region.Activate(view);
于 2012-08-03T13:35:14.513 回答