Доступ к свойству ItemsPanel из DataTemplate - PullRequest
0 голосов
/ 31 октября 2011

В контексте ListBox с Canvas ItemsPanel мне нужно получить доступ к Cavas.ZIndex для каждого элемента управления в нескольких шаблонах данных (список отображает несколько типов объектов).Недостаточно использовать

<ListBox.ItemContainerStyle>
    <Setter Property="Canvas.ZIndex" ..... />  

, поскольку существует несколько шаблонов данных, каждый с несколькими элементами управления, и я хотел бы контролировать абсолютный zindex каждого элемента управления.Это вообще возможно?

1 Ответ

1 голос
/ 31 октября 2011

Насколько мне известно, это невозможно

Причина в том, что при рендеринге ListBox он рендерит так (если вы ссылаетесь на тот же код, который был у вас в ваш другой вопрос *).1004 *):

<Canvas>
    <ListBoxItem>
        <ContentPresenter>
            <Grid>
                <TextBlock />
                <Line />
            </Grid>
        </ContentPresenter>
    </ListBoxItem>
    <ListBoxItem>
        <ContentPresenter>
            <Grid>
                <TextBlock />
                <Line />
            </Grid>
        </ContentPresenter>
    </ListBoxItem>
    <ListBoxItem>
        <ContentPresenter>
            <Grid>
                <TextBlock />
                <Line />
            </Grid>
        </ContentPresenter>
    </ListBoxItem>
    ...
</Canvas>

Как видите, каждый ListBoxItem отображается как группа вложенных элементов управления.Вы не можете нарисовать все свои текстовые блоки поверх всех ваших строк, потому что они не все имеют одного и того же родителя, а ZIndex используется для упорядочивания элементов, находящихся в одном родительском контейнере.

Обходной путь - использоватьдва отдельных ItemControls нарисованы друг над другом.Таким образом, все ваши линии будут отображаться в элементе управления Bottom ItemsControl, а все текстовые блоки будут отображаться в элементе управления Top ItemsControl.

<Grid>
    <ItemsControl ItemsSource="{Binding MyData}"
                  ItemTemplate="{DynamicResource MyLineTemplate}" />

    <ItemsControl ItemsSource="{Binding MyData}"
                  ItemTemplate="{DynamicResource MyTextBlockTemplate}" />
</Grid>
...