WPF - 没有容器的DataTemplate,将项作为网格中的行?

3

是否有一个与ItemsControl.ItemTemplate等效的机制可以与Grid一起使用?我有一组项目,我想将它们作为Grid中的行呈现,以便我可以将Grid.Column分配给模板内的单个元素(而不是列表控件中的行)。在WPF中使用标准控件是否可能实现这一点?

2个回答

12

好的,使用一个附加了Grid.IsSharedSizeScope="true"属性的ItemsControl。接下来,在你的ItemTemplate中,使用一个<Grid>,就像平常一样,只不过现在当你添加ColumnDefinition时,你需要将SharedSizeGroup属性设置为每个列都唯一的名称。例如:

<ItemsControl Grid.IsSharedSizeScope="true">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="MyFirstColumn" />
                    <ColumnDefinition SharedSizeGroup="MySecondColumn" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding MyFirstProperty}"/ >
                <TextBlock Grid.Column="1" Text="{Binding MySecondProperty}"/ >
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

关于IsSharedSizeScope和SharedSizeGroup的更多信息,请参考SDK中的这个部分。需要注意的是,RowDefinitions也有SharedSizeGroup,因此您也可以进行水平布局。


是的...那看起来就是我要走的路线。 - Rich
非常有用。在同样的情况下(我需要设置<ItemsControl.ItemTemplate>),我还想让第二列填充剩余的空间。如果我没有为第二列设置SharedSizeGroup,它会起作用:<ColumnDefinition Width =“Auto” SharedSizeGroup =“MyFirstColumn”/> <ColumnDefinition Width =“*”/> <ColumnDefinition Width =“Auto” SharedSizeGroup =“MyThirdColumn”/> - ASh

1
也许我误解了你的问题,但是一个 GridView 不正是做这个的吗?

谢谢...我甚至不知道那个存在。 - Rich
实际上,这完全不是我要找的。我不想要所有额外花哨的“数据网格”格式。我不想要列标题、排序功能、默认填充和背景等。我只想以我通常在ItemsControl中执行的方式,在网格中重复集合中的项目...仅此而已。你知道有什么吗? - Rich
好的...只是为了确保我理解:您想要水平排列项目而不是垂直排列吗? - Thomas Levesque
是的,就像一个网格,但没有GridView的所有额外开销和花哨。我实际上决定采用Drew建议的相同解决方案。使用常规Grid,但使用SharedSizeGroup在DataTemplate之外绑定列宽度。 - Rich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接