具有静态标头的ItemsControl

时间:2010-08-20 08:02:45

标签: wpf xaml headereditemscontrol

我认为我有一个非常简单的目标,但似乎无法达到目标。

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

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

然后我找到了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>

2 个答案:

答案 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获取绑定 - 内容绑定正确。如果有人解释推理,我会很感兴趣。

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

克里斯