Почему ListBox AlternationIndex всегда возвращает 0

Хорошо, я знаю, что есть несколько других подобных вопросов, но у меня есть реальная проблема с получением AlternationIndex для работы с ListBox или ListView.

мой xaml такой:

            <ListBox BorderThickness="0" Name="RecentItemsListBox" HorizontalAlignment="Stretch"
                     ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                     ItemsSource="{Binding Path=RecentFilesList}" AlternationCount="100">
                <ListBox.ItemsPanel>

                    <ItemsPanelTemplate>
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>

                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex), 
                                    RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource IncCnvrtr}}" 
                                       Foreground="DimGray" FontSize="20" FontWeight="Bold"  
                                       HorizontalAlignment="Left" Margin="5,5,15,5" />
                            <StackPanel VerticalAlignment="Center">
                                <TextBlock Text="{Binding ClassName}" Foreground="Black" />
                                <TextBlock Text="{Binding DisplayName}" Foreground="Black" />
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

преобразователь увеличивает значение на 1. Это отлично работает, и я отладил его, чтобы подтвердить, что значение, отправляемое в преобразователь, ВСЕГДА 0.

Сумасшедшая вещь, это только для ListBox или ListView

как только я изменяю его на ItemsControl, индексация корректна, но я не хочу элемент управления, я хочу список со всеми функциями, которые идут с ним.

Если у вас есть идеи относительно того, почему это может происходить, я был бы благодарен за вашу помощь.

Спасибо

Киран

1 ответ

Решение

За ListBox или же ListView вам нужно будет найти недвижимость на ListBoxItem/ListViewItem как показано ниже:

     <TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex), 
                       RelativeSource={RelativeSource AncestorType=ListBoxItem}, Converter={StaticResource IncCnvrtr}}" 
                       Foreground="DimGray" FontSize="20" FontWeight="Bold"  
                        HorizontalAlignment="Left" Margin="5,5,15,5" />

Разница связана с тем, что ItemsControl генерирует только один ContentPresenter, который становится контейнером элемента, и тот же ContentPresenter также загружает DataTemplate.

Но для ListBox, ListBoxItem являются контейнеры предметов и DataTemplate будет загружен ContentPresenter в Template из ListBoxItem, Так что ценность ListBoxItem"s ItemsControl.AlternationIndex свойство будет меняться в зависимости от индекса, но значение ItemsControl.AlternationIndex собственность ContentPresenter который загружает DataTemplate всегда будет 0, что является значением по умолчанию.

Другие вопросы по тегам