ItemTemplate для списка элементов в Xamarin - PullRequest
2 голосов
/ 21 июня 2020

У меня ListView с ItemTemplate. Для каждого элемента в моем ItemSource я хотел бы перебрать свойство в элементе и создать раздел в моем ViewCell.

Таким образом, каждый элемент Download:

public class Download
{
    public string Title { get; set; }

    public IEnumerable<SectionDownload> SectionDownloads { get; set; }
}

SectionDownload выглядит так:

public class SectionDownload
{
    public long TotalBytes { get; set; }

    public long DownloadedBytes { get; set; }

    public int PercentDownloaded { get => (int)((DownloadedBytes / TotalBytes) * 100); }
}

И мой ListView, где Downloads - это ObservableCollection<Download> в моей ViewModel:

<ListView x:Name="DownloadsListView" SelectionMode="None" ItemsSource="{Binding Downloads}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackLayout Padding="10">
                <Label Text="{Binding Title}"
                            d:Text="{Binding .}"
                            LineBreakMode="NoWrap"
                            Style="{DynamicResource ListItemTextStyle}"
                            FontSize="16" />
                <!-- Here I would like each SectionDownload to display the percentage downloaded -->
            </StackLayout>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Ответы [ 2 ]

1 голос
/ 22 июня 2020

Ошибка вызвана тем, что вы не обернули Cell внутрь DataTemplate.

Измените его как

<ListView x:Name="DownloadsListView" SelectionMode="None" ItemsSource="{Binding Downloads}">
<ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>      //add this line
        <StackLayout Padding="10">
            <Label Text="{Binding Title}"
                        d:Text="{Binding .}"
                        LineBreakMode="NoWrap"
                        Style="{DynamicResource ListItemTextStyle}"
                        FontSize="16" />
            <StackLayout BindableLayout.ItemsSource="{Binding SectionDownloads}">
                <BindableLayout.ItemTemplate>
                    <DataTemplate>
                        <ProgressBar Progress="{Binding PercentDownloaded}" />
                    </DataTemplate>
                </BindableLayout.ItemTemplate>
            </StackLayout>
        </StackLayout>
      </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>
1 голос
/ 21 июня 2020

Вы можете отобразить такой раздел.

<ListView x:Name="DownloadsListView" SelectionMode="None" ItemsSource="{Binding Downloads}">
<ListView.ItemTemplate>
    <DataTemplate>
        <StackLayout Padding="10">
            <Label Text="{Binding Title}"
                        d:Text="{Binding .}"
                        LineBreakMode="NoWrap"
                        Style="{DynamicResource ListItemTextStyle}"
                        FontSize="16" />
            <StackLayout BindableLayout.ItemsSource="{Binding SectionDownloads}">
                <BindableLayout.ItemTemplate>
                    <DataTemplate>
                        <ProgressBar Progress="{Binding PercentDownloaded}" />
                    </DataTemplate>
                </BindableLayout.ItemTemplate>
            </StackLayout>
        </StackLayout>
    </DataTemplate>
</ListView.ItemTemplate>

Значение PercentDownloaded должно быть удвоено в диапазоне от 0 до 1, а также вы должны реализовать INotifyPropertyChange в своем классе SectionDownload для обновления прогресса в реальном времени .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...