确定。所以我的xaml中有一个TabControl
对象,其ItemsSource
值为ItemsSource={Binding OpenTabs}
,其中OpenTabs
是ObservableCollection
类型ClosableTab
({ {1}})扩展public ObservableCollection<ClosableTab> OpenTabs { get; set; }
。我从here找到了TabItem
,然后根据自己的需要调整了它的视图。
我主要添加了一个属性(对于这里的名称混淆而感到抱歉)ClosableTab
。这是一个房地产计划。然后在我的xaml中我有以下几行:
isProperty
我做了一些研究,发现如果我希望某个<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
的属性,我就需要这样做。
它没有给我我想要的东西。有人可以向我解释我在这里做错了什么吗?并告诉我应该怎么做?和/或可能给我一个替代方法?我无法想到我需要改变什么以获得我需要的功能。提前谢谢。
答案 0 :(得分:2)
您需要在DataType
上设置DataTemplate
,以便在您在资源部分下定义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
的命名空间。
或强>
不是在资源中添加DataTemplate,而是将其明确设置为TabControl的ItemTemplate
。
<TabControl>
<TabControl.ItemTemplate>
<DataTemplate x:Key="DefaultTab">
.....
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
<强>更新强>
理想情况是使用单个DataTemplate
并在TextBlock上应用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>