嵌套Items控制绑定到同一Grid的数据

时间:2011-04-08 13:27:28

标签: c# wpf

这可能是一个骗局,但在一小时左右的时间内我找不到任何搜索和阅读MSDN的内容。

我正在制作一个基于2D平铺的游戏,并将ItemsControl绑定到Tiles列表(C#类)。这很有效。

<ItemsControl ItemsSource="{Binding Tiles}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="{Binding Board.Rows}" Columns="{Binding Board.Columns}"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type local:Tile}">
            <Grid x:Name="tileGrid" Background="{Binding TileImage}"/>
        </DataTemplate>
    </ItemsControl.Resources>
<ItemsControl>

每个Tile都有一个内部5x5网格,因为我需要能够在每个Tile的不同位置放置单位。每个Tile都包含一个List<Location>,其中有一个单元,我想将其放置在该网格上。

<Grid x:Name="tileGrid" Background="{Binding TileImage}">
    <ColumnDefinition snipped - there's 5 columns and 5 rows>
    <ItemsControl ItemsSource="{Binding Locations}">
        <ItemsControl.Resources>
            <DataTemplate DataType="{x:Type sys:Int32}">
                <Image Source="unit.bmp"
                        Grid.Column="{Binding Converter={StaticResource ColumnConverter}}"
                        Grid.Row="{Binding Converter={StaticResource RowConverter}}"/>
            </DataTemplate>
        </ItemsControl.Resources>
    </ItemsControl>

ColumnConverter和RowConverter只从位置获取列索引。

问题是我无法从ItemsControl内部绑定到tileGrid的Column和Row。有些人建议将Grid放在Locations ItemsControl中,但这不起作用,因为它需要是外部Tiles ItemsControl的子代。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

好像我重复了以前的建议,但你应该使用tileGrid作为Locations ItemsControl的ItemsPanel,并使这个ItemsControl成为Tiles ItemsControl的子项。我不明白为什么不可能?

也许您需要在DataTemplate中对tileGrid执行某些操作。所以,我认为可以对ItemsControl做同样的事情。

我也可以假设tileGrid中还有其他ColumnDefinitions或RowDefinitions。通过这种方式,您可以在Locations中使用另一个Grid,并使用IsSharedSizeScopeSharedSizeGroup

将其定义与tileGrid绑定

答案 1 :(得分:0)

在ItemsControl.ItemContainerStyle中设置Grid.Column和Grid.Row,而不是在DataTemplate中。每个项目都包含在ContentPresenter中,因此Grid.Column和Grid.Row未正确应用