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