Itemscontrol在controltemplate和itemtemplate之间共享网格

时间:2013-12-20 16:07:56

标签: wpf xaml itemscontrol

我有一个ItemsControl,它有很多列和一个静态标题行。

我知道HeaderedItemsControl但我不确定它能达到我想要的效果。

我目前所拥有的是ControlTemplate作为标头和ItemsPresenter的容器,然后ItemTemplate用于整理记录。

目前我在内容和项目模板中都有一个重复的网格,我想找到一个优雅的解决方案,我可以在两个模板之间共享相同的网格,所以我不必更改两件事编辑它。模拟下面的内容,实际控件有更多列。我已经阅读了IsSharedSizeScopeSharedSizeGroup,但我认为这不起作用,因为它仅在有两个网格共享父元素时才起作用(它们都需要在ControlTemplate中)

<ItemsControl ItemsSource="{Binding SomeSource}">
    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <StackPanel>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="Col1" />
                    <TextBlock Grid.Column="1" Text="Col2" />
                    <TextBlock Grid.Column="2" Text="Col3" />
                </Grid>
                <ItemsPresenter/>
            </StackPanel>
        </ControlTemplate>
    </ItemsControl.Template>

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="ItemCol1" />
                <TextBlock Grid.Column="1" Text="ItemCol2" />
                <TextBlock Grid.Column="2" Text="ItemCol3" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我可能做过一些不好的做法,所以请随时给我指点。

1 个答案:

答案 0 :(得分:0)

我觉得你将ItemsSource的值设置为完全错误。

它应该是这样的:

<ItemsControl ItemsSource="{Binding SomeSource}">

当我举出你的例子并运行它时,一切正常。

如果您希望共享列大小,则可以使用SharedSizeGroup。您必须将范围设置为ItemsControl。

您的SharedSizeGroup定义错误。无论网格放在哪里,只要他们与父母共享同一个网格,它就能工作。这是你的情况,因为ItemsControl是最顶层的控件,所以它是内部每个控件的父级。