基于项中绑定属性值的数据模板选项卡控件的来源

本文关键字:选项 控件 数据 绑定 于项中 属性 | 更新日期: 2023-09-27 17:57:03

Ok.所以我在我的 xaml 中有一个TabControl对象,它的ItemsSource值为 ItemsSource={Binding OpenTabs},其中OpenTabs是扩展TabItemClosableTabpublic 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>