ItemsControl со статическим заголовком - PullRequest
10 голосов
/ 20 августа 2010

Мне кажется, у меня довольно простая цель, но, похоже, я не могу ее достичь.

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

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

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

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

Я делаю все это в 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>

Ответы [ 2 ]

9 голосов
/ 20 августа 2010

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 для столбцов разных сеток, чтобы они имели одинаковую ширину.

0 голосов
/ 20 августа 2010

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

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

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

Крис

...