簡體   English   中英

當我嘗試在 Xamarin Forms

[英]Only the first item in a list is rendered when I try to output a collectionview inside a collectionview in Xamarin Forms

我正在嘗試在 Xamarin 視圖的列表中呈現復雜的 object 。 我要列出的 object 是視圖模型的集合。 每個視圖模型的屬性之一是另一個集合。

為了說明,該列表包含以下成員:

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

我可以看到內部集合視圖的存在正在做一些奇怪的事情,以防止呈現超出其列表的項目,從而防止恢復呈現外部列表的內容。 我肯定錯過了一些東西,但無法弄清楚。 我該如何解決這個明顯的限制?

我找不到讓我渲染嵌套列表的答案,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> 

由於視圖的數據模板中有重復條目,這不是一個理想的解決方案,而是一種有效的解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM