C# 基于TabControl的ItemsSource中绑定属性值的DataTemplate

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。这是一个房

嗯。因此,我在xaml中有一个
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>