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 顺序没有影响。这段代码我哪里出错了?

4

1 回答 1

10

的内容DataTemplate被包裹在 a中ContentPresenter,所以CanvasinDataTemplate不是ItemsPanel Grid. 这就是ZIndex属性不做任何事情的原因。

将 移至ZIndex BindingItemContainerStyle它应该可以工作。

<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> 
于 2012-06-29T15:08:09.803 回答