具有静态标头的ItemsControl

Org*_*ey 10 wpf xaml headereditemscontrol

我认为我有一个非常简单的目标,但似乎无法实现.

我想要实现的是拥有一个带有标题的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}"/>
Run Code Online (Sandbox Code Playgroud)

然后我有一个按预期工作的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>
Run Code Online (Sandbox Code Playgroud)

然后是反对其职业道德的标题,我已经尝试使用绑定和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>
Run Code Online (Sandbox Code Playgroud)

Qua*_*ter 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>
Run Code Online (Sandbox Code Playgroud)

如果您只在一个地方使用它,则可能更容易使用普通的ItemsControl并将标头直接包含在控件模板中.

此外,看起来您正在尝试使用两个网格具有相同宽度的网格.您可能希望查看WPF中的网格大小共享.如果在父控件上设置Grid.IsSharedSizeScope,则可以在不同网格的列上设置SharedSizeGroup以赋予它们相同的宽度.