WinUI 3 ListView如何在XAML中显示结构体数组的索引?
WinUI 3 ListView 显示数组索引的实现方法
WinUI 3 不支持 WPF 中 ItemsControl.AlternationIndex 的写法,你可以通过以下两种方式实现显示数组索引的需求:
方法一:给数据添加索引属性
在绑定数据前,给结构体包装一层带索引的对象,手动注入索引值:
后台代码
// 假设你的原始结构体为 MyData public ObservableCollection<MyDataWithIndex> IndexedItems { get; } = new(); // 初始化时为原始数组添加索引 var originalDataArray = new MyData[] { /* 你的结构体数组内容 */ }; foreach (var (item, index) in originalDataArray.Select((data, idx) => (data, idx))) { IndexedItems.Add(new MyDataWithIndex { OriginalData = item, Index = index }); } // 定义带索引的包装结构体 public struct MyDataWithIndex { public MyData OriginalData { get; set; } public int Index { get; set; } }
XAML 修改
<ListView ItemsSource="{x:Bind IndexedItems}"> <ListView.ItemTemplate> <DataTemplate x:DataType="local:MyDataWithIndex"> <!-- 可同时绑定原始数据和索引 --> <TextBlock Text="{x:Bind Index}"/> </DataTemplate> </ListView.ItemTemplate> </ListView>
方法二:使用转换器获取索引
通过自定义转换器,从 ListViewItem 所在的父级 ListView 中获取当前项的索引:
后台转换器代码
public class ListViewItemIndexConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { if (value is ListViewItem listViewItem) { var parentListView = ItemsControl.ItemsControlFromItemContainer(listViewItem) as ListView; return parentListView?.Items.IndexOf(listViewItem.DataContext) ?? -1; } return -1; } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } }
XAML 使用转换器
<Page.Resources> <local:ListViewItemIndexConverter x:Key="ItemIndexConverter"/> </Page.Resources> <ListView ItemsSource="{x:Bind YourOriginalDataArray}"> <ListView.ItemTemplate> <DataTemplate x:DataType="local:MyData"> <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Converter={StaticResource ItemIndexConverter}}"/> </DataTemplate> </ListView.ItemTemplate> </ListView>
内容的提问来源于stack exchange,提问作者kinton




