我认为我有一个非常简单的目标,但似乎无法达到目标。
我想要实现的是拥有一个带有标题的ItemsControl(因为我不希望列表的选择功能)。最好是静态标题。
目前我正在使用网格作为标题,然后将该网格复制到ItemsControl的ItemTemplate(DataTemple)中,然后将它们一个放在网格中。它有点工作,但它并不总是很好地排队等。
然后我找到了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>
答案 0 :(得分: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,以赋予它们相同的宽度。
答案 1 :(得分:0)
昨天碰到了类似的东西 - 对于HeaderedContentControl,尝试设置Header而不是HeaderTemplate属性。
我发现无法通过HeaderTemplate获取绑定 - 内容绑定正确。如果有人解释推理,我会很感兴趣。
希望我上面的解决方法有所帮助。
克里斯