0

我希望这是一个简单的问题。(多年来一直在编码,但 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>

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

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

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

4

1 回答 1

1

通常,对于要在ItemsControl. 这些视图模型中的每一个都将使用DataTemplate定义其外观的 a 来显示,例如:

  • 视图”选项卡将具有类型的视图模型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>

通过仅指定 aDataType模板将自动应用于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>

这同样适用于 aItemsSource和手动添加的数据项TabItem

于 2020-10-28T08:36:37.793 回答