如何将数据绑定用于不同类型的2d对象数组

时间:2013-01-29 18:15:54

标签: wpf xaml

我有几个独立但相关的问题,我是WPF的新手,所以请耐心等待。

我有一个2d的IFarmyardSpaces数组,其中一些是FenceSpaces,有些是FieldSpaces等。我基本上想要一个按钮网格绑定到每个空格,相应的按钮样式取决于哪种类型的IFarmyardSpace它是

现在问题: 1)是否可以轻松地对基本上是棋盘类型的布局进行数据绑定,并使各个项目以不同的方式进行自我调整?

2)如果没有,我需要单独创建和绑定按钮,如何将按钮绑定到2d数组中的特定对象?就像我想要一个绑定到FarmyardSpaces [0,3]中的FenceSpace的按钮一样?

提前致谢!

2 个答案:

答案 0 :(得分:1)

是的,你可以同时做到1)。基础是你需要一个ItemsControl,它的每个项目都是另一个ItemsControl(获取行,列)。要改变模板,最简单的方法是使用DataTemplate资源,这些资源具有DataType而不是Key,而不是显式分配ItemTemplate。您也可以使用DataTemplateSelector,但需要更多代码。您的模板看起来像这样:

<Window.Resources>
    <DataTemplate DataType="IFarmyardSpaces">
        <Button Style="..."/>
    </DataTemplate>
    <DataTemplate DataType="FenceSpaces">
        <Button Style="..."/>
    </DataTemplate>
</Window.Resources>

像这样的ItemsControl,这里使用UniformGrid来获得均匀划分的网格布局:

<ItemsControl ItemsSource="{Binding TwoDArray}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <UniformGrid Rows="1"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

如果阵列的大小不同,或者如果你在另一个控件上绑定相同的类型,那么可能会出现并发症,例如对齐,但这至少应该让你开始。

答案 1 :(得分:0)

您可以使用IValueConverter完成此操作。我已经在Windows 8 Metro应用程序中完成了这项工作并对此大肆宣传:http://jwillmer.de/blog/2012/11/02/how-to-display-different-items-in-a-gridview/

在MSDN上,我找到了另一个IValueConverter示例:http://msdn.microsoft.com/en-us/library/windows/apps/BR209903我希望它有助于解决您的问题; - )