从DataTemplate访问ItemsPanel属性

时间:2011-10-31 15:48:28

标签: wpf datatemplate z-index z-order

在带有Canvas ItemsPanel的ListBox的上下文中,我需要为多个DataTemplates中的每个控件访问Cavas.ZIndex(该列表显示多个对象类型)。它还不足以使用

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

因为有几个数据模板,每个模板有几个控件,我想控制每个控件的绝对zindex。 这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

据我所知,这是不可能的

原因是当ListBox呈现时,它会像这样呈现(假设您指的是your other question中的相同代码):

<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都呈现为一组嵌套控件。您不能在所有行上绘制所有TextBlock,因为它们并不都共享同一个父级,ZIndex用于对同一父级容器中的项目进行排序。

解决方法是使用两个单独的ItemsControls彼此叠加。所以你的所有Line都会被绘制在Bottom ItemsControl上,而所有的TextBlocks都会被放在Top ItemsControl上。

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

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