我正在使用 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)}" />
由于似乎没有简单的方法可以做到这一点,因此您应该跟踪项目(
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
不会被设置。