Как реализовать макет .Net Maui CollectionView с вертикальными группами и горизонтальными элементами

Я пытаюсь добиться определенного вида в приложении, которое отображает элементы по категориям. Из того, что я узнал, это то, что CollectionView позволяет нам делать это, и я успешно использовал его в различных макетах. Проблема в том, что есть ровно один макет, которого я пытаюсь достичь, но который я нигде не нашел описанным и, следовательно, мне нужна помощь/руководство.

CollectionView позволяет нам использовать либо сетку, либо линейный макет, а также группировать объекты. Я хочу добиться того, чтобы элементы группы отображались как линейная горизонтальная коллекция, а категории располагались одна за другой вертикально. (как показано на прилагаемом удивительном рисунке).

Как реализовать макет .Net Maui CollectionView с вертикальными группами и горизонтальными элементами

Я перепробовал все возможные комбинации CollectionView (которые мне известны) и не смог добиться этого, и поэтому размышляю, придется ли мне на этом этапе создавать эту вещь полностью вручную или просто создать несколько экземпляров CollectionView для каждой категории.

Любая помощь будет оценена по достоинству. P.S: тихий новичок в .Net maui и мобильной разработке. но у меня есть знание xaml.

Я попытался создать одно основное представление коллекции с isgrouped=true и groupheaderlayout. затем в качестве шаблона элемента я попытался создать другое представление коллекции, которое снова принимает группу и работает как обычное горизонтальное представление коллекции, но это не сработало.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
302
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось это сделать, выполнив следующие действия:

  1. в ItemsGroupModel объявите список того же типа объекта и заполните его исходным.
public class AnimalsCategory : List<Animal>
{
    public string GroupName { get; set; }
    public List<Animal> Animals { get; set; }
    public AnimalsCategory(string groupName, List<Animal> animals, string) : base(animals)
    {
        Animals = new List<Animal>(animals);
    }
}
  1. ViewModel является базовым и соответствует рекомендуемому стилю .Net Maui (Примечание: я использую набор инструментов Mvvm для ObservableProperty и устанавливаю значение свойства, а не поля!)
public partial class AnimalsViewModel
{
    [ObservableProperty]
    List<ShopItemsCategory> categories;
    
    public AnimalsViewModel(DataService ds)
    {
        Categories = ds.GetAnimalsInCategories();
    }
}
  1. Я позаботился о доступе к недавно определенному свойству «Животные» в XAML внутри подсписка.
<RefreshView Grid.Row = "1">
  <ScrollView>
      <CollectionView ItemsSource = "{Binding Categories}">
          <CollectionView.ItemTemplate>
              <DataTemplate x:DataType = "model:AnimalsCategory ">
                  <StackLayout Orientation = "Vertical">
                      <Label Text = "{Binding GroupName}" FontAttributes = "Bold" FontSize = "28"/>
                      <CollectionView ItemsSource = "{Binding Animals}" ItemsLayout = "HorizontalList" Background = "Transparent" Margin = "5">
                          <CollectionView.ItemTemplate>
                              <DataTemplate x:DataType = "model:Animal">
                                  <Frame CornerRadius = "20"
                                                Margin = "5,5,5,5"
                                                HasShadow = "True"
                                                BackgroundColor = "#FEF6FF"
                                                   WidthRequest = "150"
                                                   HeightRequest = "200">
                                      <StackLayout Orientation = "Vertical" 
                                           Grid.Row = "1" Margin = "0,0,0,0">
                                          <Image Source = "{Binding Image}" 
                                            Grid.Row = "0" HeightRequest = "60" 
                                             WidthRequest = "60" 
                                             Margin = "0,0,0,5"/>
                                          <Line Stroke = "LightGray" X2 = "300" 
                                            StrokeThickness = "2"/>
                                          <Label Text = "{Binding Name}" > 
                                            Margin = "0,5,0,0" 
                                             FontAttributes = "Bold" 
                                              VerticalOptions = "Center"
                                             HorizontalOptions = "Center"/>
                                           <Label Text = "{Binding > 
                                        Description}" Margin = "0,10,0,0"/>
                                      </StackLayout>
                                  </Frame>
                              </DataTemplate>
                          </CollectionView.ItemTemplate>
                      </CollectionView>
                  </StackLayout>
              </DataTemplate>
          </CollectionView.ItemTemplate>
      </CollectionView>
  </ScrollView>
</RefreshView>

Другие вопросы по теме