【问题标题】:Only the first item in a list is rendered when I try to output a collectionview inside a collectionview in Xamarin Forms当我尝试在 Xamarin Forms 的集合视图中输出集合视图时,仅呈现列表中的第一项
【发布时间】:2020-08-08 22:44:45
【问题描述】:

我正在尝试在 Xamarin 视图的列表中呈现复杂对象。我要列出的对象是视图模型的集合。每个视图模型的属性之一是另一个集合。

为了说明,该列表包含以下成员:

public class ItemsViewModel : BaseViewModel
    {
        public int Id { get; private set; }
        public bool UsedOption1 { get; private set; }
        public bool UsedOption2 { get; private set; }
        public bool UsedOption3 { get; private set; }
        public bool UsedOption4 { get; private set; }
        public List<ActivityViewModel> Activities { get; private set; }
    }

列表如下所示:

public class ActivityViewModel
{
    public string LocationDisplayName { get; private set; }
    public int SwimmersEaten { get; private set; }
}

ActivityViewModel 最多可以有 4 个项目。如果我使用下面的代码来渲染 Viewmodel:

<RefreshView IsRefreshing="{Binding IsBusy, Mode=TwoWay}" Command="{Binding LoadItemsCommand}">
        <CollectionView x:Name="ItemsCollectionView"
                ItemsSource="{Binding ItemsViewModel}">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <StackLayout Padding="10">
                        <Label Text="{Binding Title}"/>
                        <CollectionView x:Name="Actions"
                            ItemsSource="{Binding Activities}">
                            <CollectionView.ItemTemplate>
                                <DataTemplate>
                                    <StackLayout Padding="10" Orientation="Horizontal">
                                        <Label Text="{Binding DisplayName}"/>
                                        <Label Text="{Binding NumberOfGroups}"/>
                                    </StackLayout>
                                </DataTemplate>
                            </CollectionView.ItemTemplate>
                        </CollectionView>
                        <Label Text="Used Option 1"
                                IsVisible="{Binding UsedOption1}"/>
                        <Label Text="Used Option 2"
                                IsVisible="{Binding UsedOption2}"/>
                        <Label Text="Used Option 3"
                                IsVisible="{Binding UsedOption3}"/>
                        <Label Text="Used Option 4"
                                IsVisible="{Binding UsedOption4}"/>
                    </StackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </RefreshView> 

我得到了列表中的第一项,几乎按照我的意愿呈现,尽管最后缺少使用的选项。我的渲染看起来像:

Title 1
  a 0
  b 2
  c 0
  d 1

我得到了第一个顶级项目的标题、显示名称和其中 4 个项目中每个项目的组数。问题是我的列表中有后续项目没有出现。如果我删除中间的列表,我只能获取列表中第一个之外的项目,如下所示:

<RefreshView IsRefreshing="{Binding IsBusy, Mode=TwoWay}" Command="{Binding LoadItemsCommand}">
        <CollectionView x:Name="ItemsCollectionView"
                ItemsSource="{Binding ItemsViewModel}">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <StackLayout Padding="10">
                        <Label Text="{Binding Title}"/>
                        <Label Text="Used Option 1"
                                IsVisible="{Binding UsedOption1}"/>
                        <Label Text="Used Option 2"
                                IsVisible="{Binding UsedOption2}"/>
                        <Label Text="Used Option 3"
                                IsVisible="{Binding UsedOption3}"/>
                        <Label Text="Used Option 4"
                                IsVisible="{Binding UsedOption4}"/>
                    </StackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </RefreshView> 

这会呈现我列表中所有视图模型的标题和选项,如下所示:

Title 1
Used Option 3

Title 2
Used Option 2
Used Option 3

我可以看到内部集合视图的存在正在做一些奇怪的事情,以防止呈现超出其列表的项目,从而阻止恢复呈现外部列表的内容。我肯定错过了一些东西,但无法弄清楚。我该如何解决这个明显的限制?

【问题讨论】:

  • 嵌套 CollectionViews 不是一个好主意。查看分组,看看这是否适合您的目的,否则您可能需要重新考虑您的用户体验

标签: c# xamarin.forms


【解决方案1】:

我找不到让我呈现嵌套列表的答案,Jason 在评论中说这是不可能的。

由于我知道我的 ViewModel 只需要呈现不超过 4 个项目的列表,我的解决方案是将以下成员添加到 ItemsViewModel:

public ActivityViewModel Action1 => Activities?.FirstOrDefault();
public ActivityViewModel Action2 => Activities?.Skip(1).FirstOrDefault();
public ActivityViewModel Action3 => Activities?.Skip(2).FirstOrDefault();
public ActivityViewModel Action4 => Activities?.Skip(3).FirstOrDefault();

我的视图现在看起来像这样:

<RefreshView IsRefreshing="{Binding IsBusy, Mode=TwoWay}" Command="{Binding LoadItemsCommand}">
    <CollectionView x:Name="ItemsCollectionView"
            ItemsSource="{Binding ItemsViewModel}">
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <StackLayout Orientation="Horizontal">
                    <Label Text="{Binding Title}"/>
                    <Label Text="{Binding Action1.DisplayName}"/>
                    <Label Text="{Binding Action1.NumberOfGroups}"/>
                    <Label Text="{Binding Action2.DisplayName}"/>
                    <Label Text="{Binding Action2.NumberOfGroups}"/>
                    <Label Text="{Binding Action3.DisplayName}"/>
                    <Label Text="{Binding Action3.NumberOfGroups}"/>
                    <Label Text="{Binding Action4.DisplayName}"/>
                    <Label Text="{Binding Action4.NumberOfGroups}"/>
                    <Label Text="Used Option 1"
                        IsVisible="{Binding UsdOption1}"/>
                    <Label Text="Used Option 2"
                        IsVisible="{Binding UsdOption2}"/>
                    <Label Text="Used Option 3"
                        IsVisible="{Binding UsdOption3}"/>
                    <Label Text="Used Option 4"
                        IsVisible="{Binding UsdOption4}"/>
                </StackLayout>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</RefreshView> 

由于视图的数据模板中有重复条目,这不是一个理想的解决方案,但它是一种有效的解决方法。

【讨论】:

  • 感谢您的分享,请采纳您的回答,它将帮助其他有类似问题的人。
猜你喜欢
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多