这可能是一个骗局,但在一小时左右的时间内我找不到任何搜索和阅读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的子代。
我该怎么办?
答案 0 :(得分:1)
好像我重复了以前的建议,但你应该使用tileGrid作为Locations ItemsControl的ItemsPanel,并使这个ItemsControl成为Tiles ItemsControl的子项。我不明白为什么不可能?
也许您需要在DataTemplate中对tileGrid执行某些操作。所以,我认为可以对ItemsControl做同样的事情。
我也可以假设tileGrid中还有其他ColumnDefinitions或RowDefinitions。通过这种方式,您可以在Locations中使用另一个Grid,并使用IsSharedSizeScope和SharedSizeGroup
将其定义与tileGrid绑定答案 1 :(得分:0)
在ItemsControl.ItemContainerStyle中设置Grid.Column和Grid.Row,而不是在DataTemplate中。每个项目都包含在ContentPresenter中,因此Grid.Column和Grid.Row未正确应用