首页 > 解决方案 > 在 Xamarin 表单的转发器视图中使用项目的索引

问题描述

我有一个转发器视图,它的项目源是一个可观察的视图模型集合,并且有一个数据模板。现在我想使用要在数据模板中使用的特定项目的索引。有什么办法可以做到这一点?注意:转发器视图是 UXDivers.Artina 库的一部分,但它应该公开与列表视图相同的 API,因此适用于列表视图的解决方案可能也适用于转发器。

这是我到目前为止的代码:

xml:

<ctlRep:Repeater
        ItemsSource="{ Binding ListItems }"
        Padding="10, 10"
        Spacing="10"
        Orientation="Vertical">
        <ctlRep:Repeater.ItemTemplate>
            <DataTemplate>
                <elements:StructuredVideoDescriptionItemTemplate />
            </DataTemplate>
        </ctlRep:Repeater.ItemTemplate>
</ctlRep:Repeater>

视图模型:

public class VideoDescriptionStructureListItem : ObservableObject
{
    public string Title { get; set; }
    public bool IsNumberic { get; set; }
    public ObservableCollection<string> ListItems { get; set; }
}

在数据模板中,我想访问 ListItems 项目(它是一个字符串)和特定项目的索引。

标签: c#xamlxamarin.forms

解决方案


它可能不是您正在寻找的解决方案,但我最近使用以下策略解决了确切的问题

  • 引入一个包含索引属性的中间对象
  • 构建ObservableCollection这些对象中的一个而不是string对象并分配正确的索引
  • 绑定到字符串和索引而不是直接对象

该类可能如下所示:

class VideoDescriptionViewModel
{
    public string Description { get; private set; }
    public int Index { get; private set; }

    public VideoDescriptionViewModel(string description, int index)
    {
        Description = description;
        Index = index;
    }
}

你可以像这样构建实例

var videoDescriptionViewModels = videoDescriptions.Select((description, index) => new VideoDescriptionViewModel(description, index));

并从您的 XAML 绑定它

<elements:StructuredVideoDescriptionItemTemplate Description="{Binding Description}" 
                                                 Id="{Binding Id}" />

推荐阅读