关闭某些选项卡的WPF TabControl ContentTemplate

问题描述

我希望这是一个简单的问题。 (已经编码多年,但是在WPF方面经验有限。)我有一个简单的制表符控件。

<TabControl Name="TabControl">

其中包含三个标签

<TabItem Name ="View" Header="View">
   stuff here to view data
</TabItem>

<TabItem Name ="Add" Header="Add">
   a form to add data
</TabItem>

<TabItem Name ="Edit" Header="Edit">
   the same form to edit data
</TabItem>

由于我希望添加/编辑共享相同的控件,因此我为每个this答案创建了一个ContentTemplate。

<TabControl.ContentTemplate>
   <DataTemplate>
      stuff in here
   </DataTemplate>
</TabControl.ContentTemplate>

但是,我所有的选项卡都共享DataTemplate。如何隐藏/排除“视图”选项卡以共享这些控件?

解决方法

通常,对于要在ItemsControl中显示的每种数据类型,您都有不同的视图模型类型。这些视图模型中的每一个都将使用DataTemplate显示,该模型定义了它们的外观,例如:

  • 视图选项卡将具有ViewData类型的视图模型
  • 添加编辑选项卡的视图模型类型为ItemData

您将为TabControl的每种视图模型或数据类型创建数据模板。

<TabControl Name="TabControl" ItemsSource="{Binding MyItems}">
   <TabControl.Resources>
      <DataTemplate DataType="{x:Type local:ViewData}">
         <!--...your "View" tab controls.-->
      </DataTemplate>
      <DataTemplate DataType="{x:Type local:ItemData}">
         <!--...your "Add" and "Edit" tab controls.-->
      </DataTemplate>
   </TabControl.Resources>
</TabControl>

仅指定DataType,模板将自动应用于ItemsSource中的相应项目类型。如果您手动添加TabItems并将数据项设置为内容,例如:

<TabItem Name ="View" Header="View">
   <MyTreeFolder:ViewData/>
</TabItem>

作为隐式数据模板的替代方法,您可以创建自定义DataTemplateSelector并覆盖SelectTemplate。这样,您不仅可以根据数据类型选择数据模板,还可以根据需要选择单个属性,字段,方法或属性。

public class TabControlDataTemplateSelector : DataTemplateSelector
{
   public override DataTemplate SelectTemplate(object item,DependencyObject container)
   {
      if (item == null || !(container is FrameworkElement frameworkElement))
         return null;

      if (item is ViewData)
         return (DataTemplate)frameworkElement.FindResource("ViewDataTemplate");

      if (item is ItemData)
         return (DataTemplate)frameworkElement.FindResource("ItemDataTemplate");

      return null;
   }
}

在XAML中,您将使用密钥创建数据模板并添加数据模板选择器。

<TabControl Name="TabControl">
   <TabControl.Resources>
      <DataTemplate x:Key="ViewDataTemplate" DataType="{x:Type local:ViewData}">
         <!--...your "View" tab controls.-->
      </DataTemplate>
      <DataTemplate x:Key="ItemDataTemplate" DataType="{x:Type local:ItemData}">
         <!--...your "Add" and "Edit" tab controls.-->
      </DataTemplate>
   </TabControl.Resources>
   <TabControl.ContentTemplateSelector>
      <local:TabControlDataTemplateSelector/>
   </TabControl.ContentTemplateSelector>
</TabControl>

同样适用于ItemsSourceTabItem中手动添加的数据项。