获取项目内 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}}"/>
我希望能够显示 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}}"/>