我有几个独立但相关的问题,而且我是 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/