Полезной стратегией для решения этой проблемы является манипулирование исходными данными в формате, более подходящем для использования ItemsControl
. Например, двумерный массив элементов или линейный набор элементов, которые содержат свои собственные двумерные координаты, трудно использовать.
Вместо этого с помощью простого преобразования структуры данных вы можете связать свой ItemsSource
с коллекцией коллекций. Внешняя коллекция содержит три строки, а каждая внутренняя коллекция содержит четыре элемента. Каждый элемент может содержать свои действительные координаты строки и столбца и может определять, должны ли соответствующие ячейки отображать какие-либо данные.
Вот пример 2x2, чтобы показать вам, что я имею в виду:
<Grid>
<Grid.Resources>
<coll:ArrayList x:Key="sampleData">
<x:Array Type="sys:String">
<sys:String>1</sys:String><sys:String>2</sys:String>
</x:Array>
<x:Array Type="sys:String">
<sys:String>3</sys:String<sys:String>4</sys:String>
</x:Array>
</coll:ArrayList>
</Grid.Resources>
<ItemsControl ItemsSource="{StaticResource sampleData}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="1" Width="50" Height="50">
<TextBlock Text="{Binding}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
, который производит:
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
+---+---+