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

本文关键字:项目 索引 ObservableCollection 获取 | 更新日期: 2023-09-27 18:02:57

我希望能够在DataTemplate中显示索引值,但是我不希望数据被模型或视图模型持久化或支持。换句话说,如果条目在OC中的顺序发生了变化,我不想重新计算索引。该值应该在本质上与OC中的基础索引相关联。如果索引是以0为基础的(事实上,我希望是这样),这是可以的。

其他人使用的一种方法是AlternationIndex AP,但是在某些情况下它有自己的缺陷。

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

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

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

诀窍是给它一个源集合,要么在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}}"/>