Используйте Xamarin.Forms Carousel View для отображения списка ListView, каждый из которых содержит список объектов - PullRequest
0 голосов
/ 07 июля 2019

я использую Xamarin.Forms и у меня возникла проблема при попытке использования Carousel alexrainman's .

В частности, я хочу настроить представление карусели, в котором каждое представление является ListView, а затем каждый ListView будет отображать список объектов.

Я прочитал страницы документа и определил источники для моих CarouselView и ListView следующим образом:

ObservableCollection<ObservableCollection<ItemFormat>> MyCarouselSource = new ObservableCollection<ObservableCollection<ItemFormat>>();
 ObservableCollection<ItemFormat> MyListViewSource = new ObservableCollection<ItemFormat>();

но я не могу заставить его работать.

Мой ListView будет иметь список объектов, что-то вроде этого:

[
{
"field_name":"value1",
"field_value":"value11"
},
{
"field_name":"value2",
"field_value":"value22"
},
...
]

Вот мой код:

 public class ItemFormat
    {
        [JsonProperty("field_name")]
        public string FieldName { get; set; }

        [JsonProperty("field_value")]
        public string FieldValue { get; set; }
    }

Просмотр модели (в ValidationBindableBase есть INotifyPropertyChanged):

 public class MyViewModel : ValidationBindableBase
    {
...
        ObservableCollection<ObservableCollection<ItemFormat>> _myCarouselSource;
        public ObservableCollection<ObservableCollection<ItemFormat>> MyCarouselSource
        {
            get => _myCarouselSource;
            set => SetProperty(ref _myCarouselSource, value);
        }


        ObservableCollection<ItemFormat> _myListViewSource;
        public ObservableCollection<ItemFormat> MyListViewSource
        {
            get => _myListViewSource;
            set => SetProperty(ref _myListViewSource, value);
        }
   public DetailedSalaryViewModel()
        {
        }
    }

код позади

public partial class MyViewPage : ContentPage
    {
        MyViewModel viewModel = new MyViewModel();
        public MyViewPage ()
        {
            InitializeComponent ();
            BindingContext = viewModel ;
        }
    }

Представление XAML:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="salary_sheet.Views.MyViewPage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:controls="clr-namespace:CarouselView.FormsPlugin.Abstractions;assembly=CarouselView.FormsPlugin.Abstractions">
    <controls:CarouselViewControl
        x:Name="carousel"
        ItemsSource="{Binding MyCarouselSource}"
        Orientation="Horizontal"
        ShowArrows="true"
        ShowIndicators="true">
        <controls:CarouselViewControl.ItemTemplate>
            <DataTemplate>
                <ListView ItemsSource="{Binding MyListViewSource}" RowHeight="100">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Grid Padding="5">

                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width=".5*" />
                                        <ColumnDefinition Width=".5*" />
                                    </Grid.ColumnDefinitions>

                                    <Label
                                        Grid.Column="0"
                                        HorizontalOptions="Start"
                                        Text="{Binding FieldName}" />
                                    <Label
                                        Grid.Column="1"
                                        HorizontalOptions="Start"
                                        Text="{Binding FieldValue}" />
                                </Grid>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </DataTemplate>
        </controls:CarouselViewControl.ItemTemplate>
    </controls:CarouselViewControl>
</ContentPage>

Пожалуйста, помогите мне исправить определение источников для моего ListView и CarouselView.

Также, как установить и упорядочить код XAML представления.

Я действительно ценю любую помощь. Спасибо.

1 Ответ

0 голосов
/ 09 июля 2019

Что именно вы получаете как ошибку? Вы пытались обернуть свой ListView в какой-то корневой макет, например ContentView или StackLayout.

Кодовая реализация и реализация ViewModel выглядят нормально, так что, я думаю, это проблема только с синтаксическим анализом XAML.

Итак, попробуйте сделать что-то подобное с вашим представлением XAML:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="salary_sheet.Views.MyViewPage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:controls="clr-namespace:CarouselView.FormsPlugin.Abstractions;assembly=CarouselView.FormsPlugin.Abstractions">
    <controls:CarouselViewControl
        x:Name="carousel"
        ItemsSource="{Binding MyCarouselSource}"
        Orientation="Horizontal"
        ShowArrows="true"
        ShowIndicators="true">
        <controls:CarouselViewControl.ItemTemplate>
            <DataTemplate>
                <ContentView>
                    <ListView ItemsSource="{Binding MyListViewSource}" RowHeight="100">
                       <ListView.ItemTemplate>
                           <DataTemplate>
                               <ViewCell>
                                   <Grid Padding="5">

                                       <Grid.ColumnDefinitions>
                                           <ColumnDefinition Width=".5*" />
                                           <ColumnDefinition Width=".5*" />
                                       </Grid.ColumnDefinitions>

                                       <Label
                                           Grid.Column="0"
                                           HorizontalOptions="Start"
                                           Text="{Binding FieldName}" />
                                       <Label
                                           Grid.Column="1"
                                           HorizontalOptions="Start"
                                           Text="{Binding FieldValue}" />
                                   </Grid>
                               </ViewCell>
                           </DataTemplate>
                       </ListView.ItemTemplate>
                   </ListView>
                </ContentView>
            </DataTemplate>
        </controls:CarouselViewControl.ItemTemplate>
    </controls:CarouselViewControl>
</ContentPage>
...