基于项中绑定属性值的数据模板选项卡控件的来源
本文关键字:选项 控件 数据 绑定 于项中 属性 | 更新日期: 2023-09-27 17:57:03
Ok.所以我在我的 xaml 中有一个TabControl
对象,它的ItemsSource
值为 ItemsSource={Binding OpenTabs}
,其中OpenTabs
是扩展TabItem
的 ClosableTab
(public ObservableCollection<ClosableTab> OpenTabs { get; set; }
) 类型的ObservableCollection
。我从这里找到了ClosableTab
,然后根据自己的需要调整了它的观点。
主要是我添加了一个属性(很抱歉这里的名称混淆)isProperty
.这是针对房地产计划。然后在我的 xaml 中,我有以下几行:
<DataTemplate x:Key="PropertyTemplate">
<Grid>
<TextBlock Text="{Binding address}"/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="TennantTemplate">
<Grid>
<TextBlock Text="{Binding name}"/>
</Grid>
</DataTemplate>
//... That's in <Windows.Resources>
<TabControl ItemsSource="{Binding OpenTabs}" Grid.Column="1" x:Name="Tabs">
<TabControl.Resources>
<DataTemplate x:Key="DefaultTab">
<ContentControl>
<ContentControl.Triggers>
<DataTrigger Binding="{Binding isProperty}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource PropertyTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding isProperty}" Value="False">
<Setter Property="ContentTemplate" Value="{StaticResource TennantTemplate}" />
</DataTrigger>
</ContentControl.Triggers>
</ContentControl>
</DataTemplate>
</TabControl.Resources>
</TabControl>
我做了一些研究,发现如果我想让某个DataTemplate
依赖于ClosableTab
称为isProperty
的属性,这就是我需要做的。
它没有给我我想要的东西。有人可以向我解释我在这里做错了什么吗?告诉我我应该怎么做?和/或可能给我一个替代方法?我想不出我需要更改什么才能获得所需的功能。提前谢谢。
您需要
在DataTemplate
上设置DataType
,以便在资源部分下定义DataTemplate
时将其自动应用于基础数据对象。
<DataTemplate DataType="local:ClosableTab">
<ContentControl>
<ContentControl.Triggers>
<DataTrigger Binding="{Binding isProperty}" Value="True">
<Setter Property="ContentTemplate"
Value="{StaticResource PropertyTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding isProperty}" Value="False">
<Setter Property="ContentTemplate"
Value="{StaticResource TennantTemplate}" />
</DataTrigger>
</ContentControl.Triggers>
</ContentControl>
</DataTemplate>
确保在根级别将local
命名空间声明到声明ClosableTab
的命名空间。
或
不要在资源中添加数据模板,而是将其显式设置为选项卡控件的ItemTemplate
。
<TabControl>
<TabControl.ItemTemplate>
<DataTemplate x:Key="DefaultTab">
.....
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
更新
理想的情况是使用单个DataTemplate
并在文本块上应用 dataTrigger。
<TabControl ItemsSource="{Binding OpenTabs}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{Binding address}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding isProperty}"
Value="False">
<Setter Property="Text" Value="{Binding name}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>