Привязка к 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)}"/>