Я реализую масштабируемый холст, взятый из https://docs.microsoft.com/en-us/archive/blogs/kaelr/zoomableapplication2-a-million-items.
Итак, у меня есть ListBox
<ListBox x:Name="MyListBox">
...
...
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<controls:ZoomableCanvas Loaded="ZoomableCanvas_Loaded" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
С некоторыми сеттерами для прямого управления позиции элементов:
<Setter Property="Canvas.Top" Value="{Binding Top}"/>
<Setter Property="Canvas.Left" Value="{Binding Left}"/>
<Setter Property="Width" Value="{Binding Width}"/>
<Setter Property="Height" Value="{Binding Height}"/>
Я заполняю ItemSource программно:
MyListBox.ItemsSource = DataItems;
Каждый из этих объектов имеет строковое свойство «Data», которое используется триггером данных в таком способ сопоставления каждого значения Data с правильным шаблоном.
<DataTrigger Binding="{Binding Data}" Value="rectangle">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Rectangle Fill="{Binding Brush}"
RadiusX="10"
RadiusY="10"/>
<TextBlock Text="{Binding Index}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
Класс моих элементов ItemsSource имеет следующую структуру:
class Item{
public string Data...
public ObservableCollection<Item> InnerList...
...
}
Я пытаюсь создать ListBox рекурсивно читать в каждом свойстве Item InnerList, так что если у меня есть 5 элементов в моем DataItems SourceList, и каждый из них несет 2 элемента внутри InnerList: ListBox будет отображать на холсте всего 10 объектов в соответствии с шаблоном свойства Data.
Как я могу заставить список рекурсивно читать внутри свойства коллекции?