为什么ListBox AlternationIndex总是返回0

时间:2013-10-21 09:54:52

标签: wpf listbox alternation

好的,我知道还有其他几个类似的问题,但我有一个真正的问题,让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 个答案:

答案 0 :(得分:15)

对于ListBoxListView,您必须在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。

但对于ListBoxListBoxItem是项容器,而DataTemplateContentPresenter加载Template ListBoxItem。因此,ListBoxItem的{​​{1}}属性的值将根据索引而变化,但加载ItemsControl.AlternationIndex的{​​{1}}属性的值将始终为ItemsControl.AlternationIndex为0,这是默认值。