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

时间:2014-04-05 11:20:46

标签: c# wpf xaml datatemplate

确定。所以我的xaml中有一个TabControl对象,其ItemsSource值为ItemsSource={Binding OpenTabs},其中OpenTabsObservableCollection类型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的属性,我就需要这样做。

它没有给我我想要的东西。有人可以向我解释我在这里做错了什么吗?并告诉我应该怎么做?和/或可能给我一个替代方法?我无法想到我需要改变什么以获得我需要的功能。提前谢谢。

1 个答案:

答案 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>