2017-03-27 70 views
0

我有一个TabControl,我使用regionManager.RequestNavigate方法加载多个视图。 所有视图都具有相同的类型。棱镜访问视图实例TabControl

各的TabItem的头部有一个按钮,我想用删除当按下它的视图,用下面的代码:

regionManager.Regions["MainContentRegion"].Remove(view) 

我的问题是,我不知道如何能我得到包含在视图模型中按下的按钮的视图实例。这并不总是TabControl的活动视图,但也可以是非活动视图,因为按钮位于每个TabItem的标题中。

另外,我无法找到一个方法来设置在RequestNavigate方法的视图的名称...

任何帮助是非常感谢!

+0

编辑:如果现在还不清楚......这个按钮被绑定到视图模型命令,我想从其ViewModel访问View的实例。 – Alessandro

+0

你可以切换到该选项卡控件的模型优先导航吗?然后你可以删除'this',即区域中的视图模型实例。 – Haukinger

+0

我在这里写了一个复数光线课程。您可以在这里看到一个剪辑,并附有完整课程的链接。 http://brianlagunas.com/new-pluralsight-course-prism-problems-solutions-mastering-the-tabcontrol/ –

回答

0

我找到了解决我的问题。 我所做的是将视图本身作为Button Command的参数。我在MainWindow.xaml中的样式中定义了TabItem标题的DataTemplate。标题由一个ContentControl和一个按钮组成。遵循将按钮的命令绑定到视图的ViewModel中定义的事件的代码,该事件将被加载到TabItem中。所述的TabItem的内容是作为CommandParameter传递的实际视图:

<Button Command="{Binding DataContext.DataContext.CloseViewCommand, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" CommandParameter="{Binding Content, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TabItem}}}"> 

用于管理按钮点击是视图的视图模型内定义的代码,即动态加载一个模块中定义。 在视图模型,我可以简单地从该区域中删除视图,使用下面的代码:

public DelegateCommand<object> CloseViewCommand 
     { 
      get 
      { 
       if (_closeViewCommand == null) 
        _closeViewCommand = new DelegateCommand<object>(CloseView); 
       return _closeViewCommand; 
      } 
     } 
private void CloseView (object view) 
     { 

      if (_regionManager.Regions[MainWindowRegions.MainContentRegion].Views.Contains(view)) 
       _regionManager.Regions[MainWindowRegions.MainContentRegion].Remove(view); 
     }