2010-08-20 2 views
10

Я думаю, что у меня довольно простая цель, но, похоже, она не достигает ее.ItemsControl with static header

Все, чего я хочу достичь, - это иметь элемент управления ItemsControl (потому что я не хочу, чтобы функция выбора списка) с заголовком. Предпочтительно статический заголовок.

В настоящее время я использую сетку для заголовка, а затем копирую эту сетку в ItemTemplate (DataTemple) ItemsControl и затем помещая их один над другим в сетку. Это похоже на то, что оно не работает, но оно не всегда хорошо выглядит и т. Д.

Я нашел HeaderedItemsControl, который, как я думал, был блестящей идеей, но не мог заставить его работать, он просто не отображает заголовок вообще. Я пробовал следующее:

  • Просто ввести текст в «заголовок» в Xaml
  • Размещение сетки с TextBlocks со статическим текстом внутри тега ItemsControl.Header
  • Размещение сетки в HeaderTemplate (DataTemplate) и связывание его простой объект

Я делаю все это в Blend в небольшом проекте, прежде чем переместить его в производственное приложение, и я просто использую простой источник данных, который я создал.

Возможно, я пропустил лодку полностью здесь, но любая помощь будет оценена по достоинству.

Мой текущий код выглядит следующим образом, первый мой HeaderedItemsControl

<HeaderedItemsControl Header="HeaderedItemsControl" 
     ItemsSource="{Binding Collection, Mode=Default}" 
     ItemTemplate="{DynamicResource ItemsControlDataTemplate}" 
     HeaderTemplate="{DynamicResource ItemsControlHeaderDataTemplate}"/> 

тогда я получил ItemTemple, который работает, как ожидалось

<DataTemplate x:Key="ItemsControlDataTemplate"> 
     <Grid d:DesignWidth="268"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.754*"/> 
       <ColumnDefinition Width="0.246*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding Property1, Mode=Default}" TextWrapping="Wrap" d:LayoutOverrides="Height" HorizontalAlignment="Stretch" Margin="0" /> 
      <TextBlock Text="{Binding Property2, Mode=Default}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1" HorizontalAlignment="Left" Margin="0" /> 
     </Grid> 
    </DataTemplate> 

, а затем заголовок, который демонстративно против своей работы этический, я пробовал его со связыванием и с простым текстом в свойстве TextBlock.Text

<DataTemplate x:Key="ItemsControlHeaderDataTemplate"> 
     <Grid d:DesignWidth="268"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.754*"/> 
       <ColumnDefinition Width="0.246*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding Header.Header1, Mode=Default, Source={StaticResource SampleDataSource6}}" TextWrapping="Wrap" HorizontalAlignment="Stretch" Margin="0"/> 
      <TextBlock Text="{Binding Header.Header2, Mode=Default, Source={StaticResource SampleDataSource6}}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1" HorizontalAlignment="Left" Margin="0"/> 
     </Grid> 
    </DataTemplate> 

ответ

9

HeaderedItemsControl не имеет стиль по умолчанию, так что это просто использует шаблон из базового класса ItemsControl, который не оказывает никакого заголовка. Он используется только в качестве базового класса для MenuItem, ToolBar и TreeViewItem, которые определяют их собственные шаблоны. Вы можете создать свой собственный шаблон, который включает в себя ContentPresenter для заголовка:

<HeaderedItemsControl ItemsSource="{Binding}" Header="Some text"> 
    <HeaderedItemsControl.Template> 
     <ControlTemplate TargetType="HeaderedItemsControl"> 
      <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
       <DockPanel> 
        <ContentPresenter DockPanel.Dock="Top" ContentSource="Header" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </DockPanel> 
      </Border> 
     </ControlTemplate> 
    </HeaderedItemsControl.Template> 
</HeaderedItemsControl> 

Если вы используете только в одном месте, это может быть проще использовать обычный ItemsControl и включает в свой заголовок непосредственно в шаблоне управления ,

Кроме того, похоже, что вы пытаетесь создать две сетки, столбцы которых имеют одинаковую ширину. Вы можете посмотреть на Grid Size Sharing in WPF. Если вы установите Grid.IsSharedSizeScope на родительский элемент управления, вы можете установить SharedSizeGroup на столбцы разных сеток, чтобы дать им такую ​​же ширину.

+0

Спасибо, сэр, ваш ответ действительно помог. В конце я создал стиль для HeaderedItemsControl и добавил ContentPresenter, как вы предложили с атрибутом ContentSource = header. Таким образом, я могу использовать его во всех элементах ItemsControl в приложении и просто добавить сетку с TextBlock в теге HeaderedItemsControl.Header. Ответьте на свое предложение по распределению разделов по сетке, я проверю его, но не уверен, что он будет работать, поскольку одна сетка находится в DataTemplate, а другая будет в заголовке элемента ItemsControl, но я буду тестировать его и давать обратную связь –

0

Нашел что-то подобное вчера - для HeaderedContentControl попробуйте установить заголовок, а не свойство HeaderTemplate.

Мне не удалось получить привязки, работающие через HeaderTemplate - контент был привязан правильно. Мне было бы очень интересно, если кто-то объяснит рассуждения.

Надеюсь, что мое обходное решение выше помогает.

Крис