我有几个独立但相关的问题,我是WPF的新手,所以请耐心等待。
我有一个2d的IFarmyardSpaces数组,其中一些是FenceSpaces,有些是FieldSpaces等。我基本上想要一个按钮网格绑定到每个空格,相应的按钮样式取决于哪种类型的IFarmyardSpace它是
现在问题: 1)是否可以轻松地对基本上是棋盘类型的布局进行数据绑定,并使各个项目以不同的方式进行自我调整?
2)如果没有,我需要单独创建和绑定按钮,如何将按钮绑定到2d数组中的特定对象?就像我想要一个绑定到FarmyardSpaces [0,3]中的FenceSpace的按钮一样?
提前致谢!
答案 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我希望它有助于解决您的问题; - )