You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动