从DataTemplate绑定ZIndex

3

我有一个视图,大致设置如下:

<Grid>
<ViewBox>
    <Grid>
        <ItemsControl ItemsSource="{Binding MyItems}"
                      ItemTemplate="{Binding Source={StaticResource MyItemsDataTemplate}}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Grid>
</ViewBox>
</Grid>

这里使用的 DataTemplate 可以简化为以下内容:
<DataTemplate x:Key="AreaItemDisplayDataTemplate">
<Canvas Grid.ZIndex={Binding Z}>
    <Grid>
        // an shape is displayed here...
    </Grid>
</Canvas>

我现在期望ZIndex绑定到各个项的Z属性。当我调试代码时,我也可以看到Z属性getter被访问,正如我所期望的那样(例如,每当我为它引发propertychanged事件时),因此我认为绑定工作正常。

然而,ZIndex并没有按预期工作。对于实际显示的Z顺序,值的绑定没有影响。我在这段代码中错了哪里?

1个回答

10

DataTemplate的内容被包装在ContentPresenter中,因此DataTemplate中的Canvas不是ItemsPanel Grid的直接子元素。这就是为什么ZIndex属性没有任何作用。

ZIndexBinding移到ItemContainerStyle中,应该能正常工作。

<ItemsControl ItemsSource="{Binding MyItems}" 
              ItemTemplate="{Binding Source={StaticResource MyItemsDataTemplate}}"> 
    <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
            <Grid /> 
        </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Grid.ZIndex" Value="{Binding Z}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接