C# 基于TabControl的ItemsSource中绑定属性值的DataTemplate
嗯。因此,我在xaml中有一个C# 基于TabControl的ItemsSource中绑定属性值的DataTemplate,c#,wpf,xaml,datatemplate,C#,Wpf,Xaml,Datatemplate,嗯。因此,我在xaml中有一个TabControl对象,它有一个ItemsSource值ItemsSource={Binding OpenTabs},其中OpenTabs是ClosableTab类型的observedcollection(public observedcollection OpenTabs{get;set;}),它扩展了TabItem。我从中找到了ClosableTab,然后根据自己的需要调整了它的视图 我主要添加了一个属性(很抱歉这里的名称混淆)isProperty。这是一个房
TabControl
对象,它有一个ItemsSource
值ItemsSource={Binding OpenTabs}
,其中OpenTabs
是ClosableTab
类型的observedcollection
(public observedcollection OpenTabs{get;set;}
),它扩展了TabItem
。我从中找到了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>
//... 那是在
我做了一些研究,发现如果我想拥有一个依赖于ClosableTab
中名为isProperty
的属性的DataTemplate
,我需要这样做
它没有给我想要的。有人能给我解释一下我做错了什么吗?告诉我该怎么做?和/或可能给我一个替代方法?我想不出我需要改变什么来获得我所需要的功能。提前感谢。您需要在
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>
更新 理想的情况是使用单个
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>
我可以在
下添加两个数据模板吗?不可以。在其下添加DefaultTab
模板。不过,还有另一个解决方法,让我用这个方法更新一下答案。
<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>