获取项目内 ObservableCollection 中项目的索引

Getting index of an item in an ObservableCollection inside the item

我希望能够显示 DataTemplate 中的索引值,但我不希望数据由模型或视图模型保留或支持.换句话说,如果 OC 中项目的顺序发生变化,我不想重新计算索引。该值应在本质上与 OC 中的基础指数相关联。如果索引是基于 0 的(事实上,我希望如此)。

其他人使用的一种方法是 AlternationIndex AP, but this has its own pitfalls 用于某些情况。

最后一个想法:我忍不住认为转换器将对最终解决方案有所帮助。

我会使用转换器来完成此操作。

诀窍是在 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;
    }
}

您可以实现强类型化,return 格式化字符串作为数字等。基本模式将如上所示。

此实现使用参数方法,因为在我看来制作 DP 更加混乱。因为你不能绑定ConverterParameter,我把它设置为绑定到集合的静态资源:

<CollectionViewSource x:Key="collectionSource" Source="{Binding Path=MyCollection}" />

...

<TextBlock Text="{Binding Converter={StaticResource ResourceKey=ItemToIndexConverter}, 
               ConverterParameter={StaticResource ResourceKey=collectionSource}}"/>