在WinUI 3 ListView中显示索引

问题描述 投票:0回答:1

我正在使用 WinUI3 显示 ListView。我正在显示一个结构数组,但是是否可以在 XAML 中显示不属于该结构一部分的数组索引?

<ListView>
  <ListView.ItemTemplate>
    <DataTemplate x:DataType="local:MyData">
      <TextBlock Text="{x:Bind Index}"/>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

我看到在WPF中,你可以像下面这样做,但是在WinUI3中会导致错误。 WinUI3中没有这个方法吗?

<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=(ItemsControl.AlternationIndex)}" />
xaml winui-3 winui windows-community-toolkit winui-xaml
1个回答
1
投票

由于似乎没有简单的方法可以做到这一点,因此您应该跟踪项目(

MyData
)本身的索引。但如果你做不到,你可以试试我想出的办法。有用。 Visual Studio 会对你大喊大叫,但它确实有效。

首先,您需要安装 CommunityToolkit.WinUI.Extensions NuGet 包。

然后:

public partial class ListViewItemElementToIndexConverter : IValueConverter
{
    private ListView? OwnerListView { get; set; }

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var frameworkElement = value as FrameworkElement;
        OwnerListView ??= frameworkElement?.FindAscendant<ListView>();
        string index = OwnerListView?.Items.IndexOf(frameworkElement?.DataContext).ToString() ?? "-1";
        return index;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}
<Page.Resources>
    <local:ListViewItemElementToIndexConverter x:Key="ListViewItemElementToIndexConverter" />
</Page.Resources>

<ListView ItemsSource="{x:Bind ViewModel.MyDataCollection, Mode=OneWay}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="local:MyData">
            <ListViewItem>
                <TextBlock
                    x:Name="IndexTextBlock"
                    Text="{x:Bind IndexTextBlock, Mode=OneWay, Converter={StaticResource ListViewItemElementToIndexConverter}}" />
            </ListViewItem>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

更新

您需要用

DataTemplate
包裹
ListViewItem
内容,除非
DataContext
不会被设置。

© www.soinside.com 2019 - 2024. All rights reserved.