11

我想我有一个非常简单的目标,但似乎无法实现。

我想要实现的只是拥有一个带有标题的 ItemsControl(因为我不想要列表的选择功能)。最好是静态标题。

目前我正在为标题使用一个网格,然后将该网格复制到 ItemsControl 的 ItemTemplate (DataTemple) 中,然后将它们一个放在另一个网格中。它有点工作,但它并不总是很好地排列等等。

然后我发现了 HeaderedItemsControl,我认为这是一个绝妙的主意,但无法让它发挥作用,它根本不显示标题。我尝试了以下方法;

  • 只需在 Xaml 的“标题”中输入文本
  • 在 ItemsControl.Header 标记内放置一个带有 TextBlocks 的网格和静态文本
  • 将网格放置在 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>
4

2 回答 2

10

HeaderedItemsControl 没有默认样式,因此它只是使用基础 ItemsControl 类中的模板,它不呈现任何 Header。它仅被框架用作 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 以使它们具有相同的宽度。

于 2010-08-20T12:04:01.767 回答
0

昨天遇到类似的事情 - 对于 HeaderedContentControl,尝试设置 Header 而不是 HeaderTemplate 属性。

我发现无法通过 HeaderTemplate 进行绑定 - 内容绑定正确。如果有人解释原因,我会非常感兴趣。

希望我上面的解决方法有所帮助。

克里斯

于 2010-08-20T08:06:53.520 回答