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

Lyn*_*ing 5 c# wpf ivalueconverter

我希望能够在DataTemplate中显示索引值,但我不希望数据由模型或视图模型保留或支持.换句话说,如果OC中项目的顺序发生变化,我不想重新计算索引.该值应与OC中的基础索引固有关联.如果索引从0开始是可以的(实际上,我希望它).

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

最后一个想法:我不禁想到转换器将在最终解决方案中发挥作用.

Bra*_*NET 8

我会使用转换器来做到这一点.

诀窍是在它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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以强制键入实现,将格式化的字符串作为数字返回,等等.基本模式如上所述.

这个实现使用参数方法,因为在我看来,DP更加混乱.因为你无法绑定ConverterParameter,所以我将它设置绑定到集合的静态资源:

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

...

<TextBlock Text="{Binding Converter={StaticResource ResourceKey=ItemToIndexConverter}, 
               ConverterParameter={StaticResource ResourceKey=collectionSource}}"/>
Run Code Online (Sandbox Code Playgroud)

  • @Rachel 在合理的范围内,我不这么认为。它肯定比绑定更新一次的数据(集合的一次迭代)效率低。所以除非你的收藏量很大并且经常变化,否则我认为这是安全的。真正的问题是所有额外的枚举(如果我没记错的话,时间复杂度为 O(n log n))。当然,OP 要求的解决方案不涉及更有效的方法所需的内容。在给定的限制下,这是我能想到的最好的方法。 (2认同)