WPF Items控制 ItemsSource 中当前的 ListItem 索引
是否可以知道 ItemsControl 中当前项目的索引?
编辑这有效!
<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>
它看起来像这样:
Is it possible to know the current item's Index in a ItemsControl?
EDIT This works!
<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>
It looks like this:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我不久前问过同样的事情这里
没有内置的 Index 属性,但您可以设置
AlternationCount
将 ItemsControl 的值设置为高于项目计数,并绑定到AlternationIndex
应该注意的是,如果您的 ListBox 使用虚拟化作为 bradgonesurfing 在这里指出。
I asked the same thing a while ago here
There isn't a built in Index property, but you can set the
AlternationCount
of your ItemsControl to something higher than your item count, and bind to theAlternationIndex
It should be noted that this solution may not work if your ListBox uses Virtualization as bradgonesurfing pointed out here.
这不完全是答案,而是建议。不要按照建议使用 AlternationIndex 技术。它似乎首先有效,但也有奇怪的副作用。看来您不能保证 AlternationIndex 从 0 开始。
第一次渲染时它可以正常工作
但重新-调整网格大小,然后扩展索引中的结果
不再从零开始。可以看到下图的效果
image
这是从以下 XAML 生成的。那里有一些自定义组件,但您会明白的。
我正在寻找替代解决方案:(
This is not quite an answer but a suggestion. Do not use the AlternationIndex technique as suggested. It seems to work first off but there are wierd side effects. It seems that you cannot guarantee that the AlternationIndex starts at 0.
On first rendering it works correctly
but re-sizing the Grid and then expanding results in the index
not starting at zero any more. You can see the effect in the below
image
This was generated from the following XAML. There are some custom components in there but you will get the idea.
I am searching for an alternate solution :(
使用 Alternation Count 时,请记住,您还可以将
AlternationCount
属性绑定到要绑定到的集合的当前项目计数,因为AlternationCount
是DependencyProperty< /代码>。
希望有帮助。
When you use Alternation Count remember that you can also Bind the
AlternationCount
property to the current count of Items of the collection you are binding to sinceAlternationCount
is aDependencyProperty
.Hope it helps.
是的!
ItemsControl
公开 ItemContainerGenerator 属性。ItemContainerGenerator
具有诸如IndexFromContainer
之类的方法,可用于查找给定项目的索引。请注意,如果将ItemsControl
绑定到对象集合,则会自动为每个对象生成一个容器。您可以使用 ContainerFromItem 方法找到每个绑定项的容器。Yes it is!
ItemsControl
exposes an ItemContainerGenerator property. TheItemContainerGenerator
has methods such asIndexFromContainer
which can be used to find the index of a given item. Note that if you bind yourItemsControl
to a collection of objects, a container is automatically generated for each. You can find the container for each bound item using theContainerFromItem
method.更可靠的方法是使用值转换器生成带有索引的新集合。有了几个助手,这相当轻松。我使用 ReactiveUI
IEnumerable.CreateDerivedCollection()
和一个辅助类 I为其他目的而编写的称为索引的。和转换器
以及在 XAML 中我可以做
A more reliable way is to use a value converter to generate a new collection with an index. With a couple of helpers this is pretty painless. I use ReactiveUI's
IEnumerable<T>.CreateDerivedCollection()
and a helper class I wrote for other purposes called Indexed.and the converter
and in the XAML I can do