2

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

我有一个 IFarmyardSpaces 的二维数组,其中一些是 FenceSpaces,一些是 FieldSpaces,等等。我基本上想要一个绑定到每个这些空间的按钮网格,并根据 IFarmyardSpace 的类型使用适当的按钮样式。

现在的问题是:1)是否可以轻松地将本质上是棋盘类型的布局进行数据绑定,并让各个项目以不同的方式自行设置样式?

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

提前致谢!

4

2 回答 2

2

是的,您可以同时执行 1)。基础是您需要一个 ItemsControl,其中每个项目都是另一个 ItemsControl(获取行、列)。要改变模板,最简单的方法是使用具有 DataType 且没有 Key 的 DataTemplate 资源,而不是显式分配 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>

可能会出现复杂情况,例如如果数组大小不同时对齐,或者如果您在另一个控件上绑定相同类型,则模板会在其他地方应用,但这至少应该让您开始。

于 2013-01-29T18:35:35.110 回答
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我希望它有助于解决您的问题 ;-)

于 2013-01-29T18:19:39.830 回答