如何使用对象中指定的行/列将`ObservableCollection`绑定到Grid?

时间:2013-03-12 22:51:27

标签: c# wpf xaml

我在网格中有这样的东西:

    <Ellipse Grid.Row="{Binding Path=Game.Tiles[2].Row}"
             Grid.Column="{Binding Path=Game.Tiles[2].Column}"
             Fill="{Binding Game.Tiles[2].FillColor}"
             Stroke ="{StaticResource TileStroke}"></Ellipse>

如何在不键入24次的情况下枚举所有24个对象?

1 个答案:

答案 0 :(得分:4)

为了显示对象的列表/集合,您需要使用各种“ItemsControl”。在这种情况下,以下片段可能有所帮助:

<ItemsControl ItemsSource="{Binding Game.Tiles}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/> 
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Grid.Column" Value="{Binding Column}" />
            <Setter Property="Grid.Row" Value="{Binding Row}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:Position}">
            <Ellipse Fill="{Binding FillColor}"
                     Stroke="{StaticResource TileStroke}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

请记住将DataTemplate的正确数据类型和足够的行/列放入网格中以保存数据。

包含未知数量的行/列也不是那么容易。如果有兴趣的话,我可以用一个解决方案回复你,但原帖如同游戏板的想法 - 就像跳棋一样 - 所以我假设列/行的数量是不变的。