ItemsControl со статическим заголовком

Я думаю, что у меня довольно простая цель, но я не могу ее достичь.

Все, чего я хочу, - это иметь 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>
10
задан Organ Grinding Monkey 20 August 2010 в 08:02
поделиться

2 ответа

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 и включить ваш заголовок непосредственно в шаблон элемента управления.

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

9
ответ дан 4 December 2019 в 01:54
поделиться

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

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

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

Крис

0
ответ дан 4 December 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: