绑定到 ItemsControl 中 ItemsControl 的 AlternationIndex

Bind to AlternationIndex of ItemsControl in ItemsControl

考虑以下 XAML

<ItemsControl ItemsSource="{Binding Path=MyItems, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" AlternationCount="999" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex), 
                                        RelativeSource={RelativeSource TemplatedParent}, 
                                        FallbackValue=FAIL, 
                                        StringFormat={}Index is {0}}" />
                <ItemsControl ItemsSource="{Binding Path=MySubItems, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=1}, Path=(ItemsControl.AlternationIndex)}"/>
                                <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/>
                            </StackPanel>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

有三个 TextBlock 节点。第一个 TextBlock 是第一个 ItemsControl 的直接子项,并按预期显示 AlternationIndex。但是,我需要更深一层的 AlternationIndex,在第二个 ItemsControl 中。因此我不能使用 TemplatedParent 并认为我可以找到具有 AncestorLevel 的 Ancestor。但是,第二个 ItemsControl 中的两个 TextBlock 节点都显示“0”。

我错过了什么?如何从第二个 ItemsControl 中定位第一个 ItemsControl?

AlternationIndex 不会在 ItemsControl 上,而是在它的每个子控件上。使用 DataTemplate,您的 ItemsControl 会将每个子项存储在一个具有 AlternationIndex 的 ContentPresenter 中。您需要修改的内容:

<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/>
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/>