【发布时间】: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