WPF ItemsControl l'index ListItem actuel dans ItemsSource
Est-il possible de connaître le courant de l'élément d'Index dans un ItemsControl?
MODIFIER Cela fonctionne!
<Window.Resources>
<x:Array Type="{x:Type sys:String}" x:Key="MyArray">
<sys:String>One</sys:String>
<sys:String>Two</sys:String>
<sys:String>Three</sys:String>
</x:Array>
</Window.Resources>
<ItemsControl ItemsSource="{StaticResource MyArray}" AlternationCount="100">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="10">
<!-- one -->
<TextBlock Text="{Binding Path=.,
StringFormat={}Value is {0}}" />
<!-- two -->
<TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex),
RelativeSource={RelativeSource TemplatedParent},
FallbackValue=FAIL,
StringFormat={}Index is {0}}" />
<!-- three -->
<TextBlock Text="{Binding Path=Items.Count,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ItemsControl}},
StringFormat={}Total is {0}}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Il ressemble à ceci:
source d'informationauteur Jerry Nixon - MSFT
Vous devez vous connecter pour publier un commentaire.
J'ai demandé la même chose il y a un moment ici
Il n'est pas intégré dans l'Indice de la propriété, mais vous pouvez définir la
AlternationCount
de votre ItemsControl à quelque chose de plus grand que votre nombre d'éléments, et de le lier à laAlternationIndex
Il convient de noter que cette solution peut ne pas fonctionner si votre ListBox utilise la Virtualisation comme bradgonesurfing souligné ici.
Lorsque vous utilisez l'Alternance Comte n'oubliez pas que vous pouvez également Lier les
AlternationCount
propriété le nombre d'Éléments de la collection qui vous lie depuisAlternationCount
est unDependencyProperty
.Espère que cela aide.
Ce n'est pas tout à fait une réponse, mais une suggestion. Ne pas utiliser le AlternationIndex technique, comme l'a suggéré. Il semble d'abord mais il y a de bizarre effets secondaires. Il semble que vous ne pouvez pas garantir que le AlternationIndex commence à 0.
Sur le premier rendu qu'il fonctionne correctement
mais re-dimensionnement de la Grille, puis d'étendre les résultats à l'indice de
ne commence pas à zéro. Vous pouvez voir l'effet dans le ci-dessous
image
Cela a été générée à partir du code XAML suivant. Il y a des composants personnalisés là, mais vous obtenez l'idée.
Je suis à la recherche d'une solution de rechange 🙁
Oui il l'est!
ItemsControl
expose une ItemContainerGenerator de la propriété. LeItemContainerGenerator
a des méthodes telles queIndexFromContainer
qui peut être utilisé pour trouver l'indice d'un élément donné. Notez que si vous liez votreItemsControl
à une collection d'objets, un conteneur est généré automatiquement pour chaque. Vous pouvez trouver l'un conteneur pour chaque objet lié à l'aide de laContainerFromItem
méthode.Une façon plus fiable est d'utiliser un convertisseur de valeurs à générer une nouvelle collection avec un index. Avec un couple d'assistants c'est assez indolore. J'utilise ReactiveUI de l'
IEnumerable<T>.CreateDerivedCollection()
et une classe d'assistance que j'ai écrit pour d'autres fins appelé Indexés.et le convertisseur
et dans le XAML, je peux faire