如何显示HeaderedItemsControl's Header

本文关键字:Header HeaderedItemsControl 何显示 显示 | 更新日期: 2023-09-27 18:06:46

我有以下代码:

 <Window.Resources>      
       <DataTemplate x:Key="SectionTemplate" >                          
              <TextBlock Text="{Binding Path=Name}" />                  
       </DataTemplate>
 </Window.Resources>
 <Grid >        
   <Border>
       <HeaderedItemsControl Header="Top1"
                             ItemsSource="{Binding Path=List1}" 
                             ItemTemplate="{StaticResource SectionTemplate}"/>
    </Border>       
 </Grid>
public class MainWindow
{
   public List<Item> List1
   {
      get { return list1; }
      set { list1 = value; }
   }
   public MainWindow()
   {             
      list1.Add(new Item { Name = "abc" });
      list1.Add(new Item { Name = "xxx" });
      this.DataContext = this;      
      InitializeComponent();       
   }   
}
public class Item
{     
    public string Name { get; set; }
}

由于某些原因,Items被渲染,但没有标题。

如何显示HeaderedItemsControl's Header

正如文档所指出的:

HeaderedItemsControl有一个有限的默认样式。要创建具有自定义外观的HeaderedItemsControl,请创建一个新的ControlTemplate。

所以当你创建模板时,一定要包括一些ContentPresenter,它与Header绑定(例如使用ContentSource)

<HeaderedItemsControl.Template>
    <ControlTemplate TargetType="{x:Type HeaderedItemsControl}">
        <Border>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <ContentPresenter ContentSource="Header" />
                <Separator Grid.Row="1" />
                <ItemsPresenter Grid.Row="2" />
            </Grid>
        </Border>                       
    </ControlTemplate>
</HeaderedItemsControl.Template>

(省略所有默认绑定(Margin, Background等))

您可以为标题创建一个DataTemplate,就像您为项目所做的那样(这肯定比重做整个控件模板更具侵入性)。

<Window.Resources>
  <DataTemplate x:Key="HeaderTemplate">
  </DataTemplate>
</Window.Resources>
<HeaderedItemsControl Header="Top1"
                      HeaderTemplate="{StaticResource HeaderTemplate}"
                      ItemsSource="{Binding Path=List1}"
                      ItemTemplate="{StaticResource SectionTemplate}"
                      />

不用e.g.。"Top1"就像这里一样,你可以绑定到一个对象,然后在DataTemplate中使用相对于该对象的绑定。

这种方法有一个问题,那就是为非控制元素(特别是TextBlock)获取样式的必要方法有点复杂;另请参阅WPF一些未应用于DataTemplate控件的样式。(你也可能在使用ControlTemplate方法时遇到这种情况)