棱镜访问视图实例TabControl

时间:2017-03-27 01:08:04

标签: wpf prism region

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

每个TabItem的标题都有一个按钮,我想用它在按下时删除视图,使用以下代码:

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

我的问题是我不知道如何获取包含在viewmodel中按下的按钮的视图实例。这并不总是TabControl的Active视图,但也可以是非活动视图,因为按钮位于每个TabItem的Header中。

另外,我找不到在RequestNavigate方法中设置视图名称的方法......

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。 我所做的是将视图本身作为Button Command的参数传递。我在MainWindow.xaml中的样式中定义了TabItem标头的DataTemplate 标题由ContentControl和Button组成。下面的代码将按钮的命令绑定到将加载到TabItem的View的ViewModel中定义的事件。 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}}}">

管理按钮单击的代码在View的ViewModel中定义,ViewModel是在动态加载的Module中定义的。 在ViewModel中,我可以使用以下代码从区域中删除视图:

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);
        }