我希望能够在DataTemplate内显示索引值,但是我不想将数据持久化或由模型或ViewModel支持。换句话说,如果OC中的项目顺序发生变化,我不想重新计算索引。该值应与OC中的基础索引固有地绑定在一起。如果索引是从0开始的(实际上,我会这样期望),那么也可以。其他人使用的一种方法是AlternationIndex AP,但这对某些情况有其自身的缺陷。最后一个想法:我不能不认为转换器在最终解决方案中会很有用。
我会使用转换器来完成这个任务。
关键是提供源集合,可以在ConverterParameter
或依赖属性上设置。此时,转换就像使用IndexOf
一样简单。
这是一个执行此操作的示例转换器:
public class ItemToIndexConverter : IValueConverter
{
public object Convert(...)
{
CollectionViewSource itemSource = parameter as CollectionViewSource;
IEnumerable<object> items = itemSource.Source as IEnumerable<object>;
return items.IndexOf(value as object);
}
public object ConvertBack(...)
{
return Binding.DoNothing;
}
}
您可以通过使实现强类型化、返回格式化的数字字符串等方式来对其进行实现。但基本模式将与上面相同。
此实现使用参数方法,因为在我看来,制作DP更加混乱。由于无法绑定ConverterParameter
,因此我将其设置为静态资源,该静态资源已绑定到集合:
<CollectionViewSource x:Key="collectionSource" Source="{Binding Path=MyCollection}" />
...
<TextBlock Text="{Binding Converter={StaticResource ResourceKey=ItemToIndexConverter},
ConverterParameter={StaticResource ResourceKey=collectionSource}}"/>
IEnumerable<object>
,但实际上并不重要。你的转换器会处理它。 - Lynn Crumbling