Я думаю, что у меня довольно простая цель, но я не могу ее достичь.
Все, чего я хочу, - это иметь ItemsControl (потому что мне не нужны функции выбора списка) с заголовком. Желательно статический заголовок.
В настоящее время я использую сетку для заголовка, а затем копирую эту сетку в ItemTemplate (DataTemple) элемента управления ItemsControl, а затем помещаю их один над другим в сетку. Это вроде как работает, но не всегда хорошо выстраивается и т. Д.
Затем я нашел HeaderedItemsControl, который, на мой взгляд, был блестящей идеей, но не могу заставить его работать, он просто не показывает заголовок вообще. Я пробовал следующее;
Я делаю все это в 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>
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 для столбцов разных сеток, чтобы придать им одинаковую ширину.
Вчера наткнулся на нечто подобное - для HeaderedContentControl попробуйте установить Header, а не свойство HeaderTemplate.
Я обнаружил, что невозможно заставить работать привязки через HeaderTemplate - контент был привязан правильно. Мне было бы очень интересно, если бы кто-нибудь объяснил причину.
Надеюсь, что приведенный выше обходной путь поможет.
Крис