У меня такой код:

 <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 отображаются, но без заголовка.

7
jerrys 28 Авг 2011 в 16:36

2 ответа

Лучший ответ

Как указано в документации:

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>

( Все привязки по умолчанию (поля, фон и т. д.) опущены. )

9
H.B. 30 Сен 2012 в 22:49

Вы можете сделать DataTemplate для заголовка точно так же, как вы это сделали для элементов (что, безусловно, менее навязчиво, чем повторение всего шаблона элемента управления).

Например

<Window.Resources>
  <DataTemplate x:Key="HeaderTemplate">
  </DataTemplate>
</Window.Resources>

<HeaderedItemsControl Header="Top1"
                      HeaderTemplate="{StaticResource HeaderTemplate}"
                      ItemsSource="{Binding Path=List1}"
                      ItemTemplate="{StaticResource SectionTemplate}"
                      />

Вместо использования, например, «Top1», как здесь, вы можете выполнить привязку к объекту, а затем использовать привязку относительно этого объекта в DataTemplate.

Есть одна проблема с этим подходом: необходимый подход к добавлению стилей для неконтролирующих элементов (особенно TextBlock) немного запутан; также см. WPF Некоторые стили не применяются к элементам управления DataTemplate. (Вы также можете столкнуться с этим при использовании подхода ControlTemplate.)

0
Craig 24 Фев 2020 в 20:48