Привязка к AlternationIndex ItemsControl в 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. 1st TextBlock является прямым потомком 1st ItemsControl и показывает AlternationIndex, как и ожидалось. Тем не менее, мне нужно, чтобы AlternationIndex уровень глубже, во втором ItemsControl. Поэтому я не могу использовать TemplatedParent и думал, что смогу найти Предка с AncestorLevel. Однако оба узла TextBlock во втором элементе ItemsControl показывают "0".

Что мне не хватает? Как мне настроить таргетинг на 1-й ItemsControl из 2-го ItemsControl?

1 ответ

Решение

AlternationIndex будет не в ItemsControl, а в каждом из его дочерних элементов. Используя DataTemplate, ваш ItemsControl будет хранить каждого потомка в ContentPresenter, который будет иметь AlternationIndex. Что нужно изменить:

<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)}"/>
Другие вопросы по тегам