如何解决关闭某些选项卡的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>
同样适用于ItemsSource
和TabItem
中手动添加的数据项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。