wpf - 如何使用不同类型对象的二维数组进行数据绑定(bind)

标签 wpf xaml

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

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

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

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

提前致谢!

最佳答案

是的,您可以执行 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>

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

关于wpf - 如何使用不同类型对象的二维数组进行数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589511/

相关文章:

WPF:设置 GridViewColumn 的文本对齐方式

wpf - 命名空间声明中的限定名称

wpf - 我们可以在窗口上使用多 xaml 布局吗?

c# - ToolTip 用于显示集合中项目的索引。 C# WPF MVVM

c# - 多点触控和隔离区域

c# - WPF:按键解决嵌套样式

xaml - 将显示效果应用于 InkToolbar [UWP]

.net - 适用于 Windows Forms 和 WPF 的商业控制套件 : which can be recommended?

WPF 与分辨率无关

.net - WPF:如何根据 XAML 中另一个的 Text 属性更改文本框的前景色?