使用Prism - WPF关闭动态添加的Tab项

时间:2017-03-07 15:31:54

标签: c# wpf mvvm prism tabcontrol

我使用Prism RegionManager,在TabControl内的MainView区域注册不同的观看次数。

MainView.xaml

    <TabControl regions:RegionManager.RegionName="MainViewTabRegion">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <DockPanel Width="Auto">
                    <Button Command="{Binding DataContext.DataContext.CloseTabCommand, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}"
                            CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}"
                            Content="X"
                            Cursor="Hand"
                            DockPanel.Dock="Right"
                            Focusable="False"
                            FontFamily="Courier"
                            FontWeight="Bold"
                            Margin="4,0,0,0"
                            FontSize="10"
                            VerticalContentAlignment="Center"
                            Width="15" Height="15" />

                            <ContentPresenter Content="{Binding DataContext.DataContext.HeaderText, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" />
                 </DockPanel>
             </DataTemplate>
        </TabControl.ItemTemplate>
    </TabControl>

在MainViewViewModel中我用相同的基类添加不同的视图。

MainViewViewModel.cs:

private void AddProjectView() {
     var view = _container.Resolve<ProjectSettingsView>();
     var dataContext = _container.Resolve<ProjectSettingsViewModel>();
     dataContext.HeaderText = "test header txt";
     view.DataContext = dataContext;
     _regionManager.RegisterViewWithRegion("MainViewTabRegion", () => view);
}

我可以在视图中添加新的标签项。

如何关闭标签项,上面XAML代码中的<TabControl.ItemTemplate>,在CloseCommand中添加一个ProjectSettingsViewModel的关闭按钮,TabItem与其绑定。

ProjectSettingsViewModel.cs

private void OnExecuteCloseCommand(object tabItem) {
     //Close this TabItem
}

3 个答案:

答案 0 :(得分:5)

CommandParameter的{​​{1}}属性绑定到Button的{​​{1}}:

DataContext

然后,您可以在视图模型中删除这样的视图:

TabItem

答案 1 :(得分:3)

您只需要获取对IRegionManager的引用。然后,您将获得视图所属的Region,并在区域上调用Remove并传递tabItem引用以将其删除。

例如:

private void OnExecuteCloseCommand(object tabItem) {
     regionManager.Regions["MainViewTabRegion"].Remove(tabItem);
}

您实际上可以将它放在MainViewViewModel中并在DataTemplate中绑定它,然后您不必为每个标签项的视图模型重写close命令。

答案 2 :(得分:1)

我在我的Pluralsight课程&#34; Prism Problems&amp; amp;解决方案:掌握Tab控件&#34;。您可以在此处查看解决方案:https://app.pluralsight.com/library/courses/prism-mastering-tabcontrol/table-of-contents

基本上,您只需要创建一个TriggerAction,它可以为您完成所有工作。简单。虚拟机无需任何操作。