Рекурсивные элементы ZoomableCanvas - PullRequest
0 голосов
/ 18 июня 2020

Я реализую масштабируемый холст, взятый из 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.

Как я могу заставить список рекурсивно читать внутри свойства коллекции?

...