Группировка и отображение элементов разных типов в виде коллекции - Xamarin Forms - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь получить журнал типа gui, где записи упорядочены по дате. Я хочу получить записи из журнала в базе данных и сгруппировать записи, которые были добавлены в тот же день, и разделить эти группы меткой. Вроде как история чата в мессенджере facebook.

Вот о чем я думал:

    <ScrollView>
        <CollectionView ItemsSource="{Binding JournalEntries}" SelectionMode="None">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Label>Date</Label>
                    <CollectionView ItemsSource="{Binding}">

                    </CollectionView>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </ScrollView>

Проблема в том, что объект JournalEntry может быть разных типов. Например, «Фото» происходит от «JournalEntry». Поэтому, если объект «Фото» находится в коллекции «JournalEntries», я хочу, чтобы отображалось изображение, а не текст «ToString ()».

  1. Что бы он лучший способ сгруппировать JournalEntries в разные дни, чтобы я мог отображать метку над группой?

  2. Как я могу решить, во время выполнения, должен ли объект отображаться как изображение или как текст?

Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вот ответы: -

  1. Вы можете использовать JournalEntries.GroupBy(x=> x.date).ToDictionary(). Для этого вам придется использовать System.Ling. Это вернет вам словарь, ключом которого будет дата, и все записи в форме списка в значении. Это будет проще для вас.

  2. Вы можете использовать DataTemplateSelector или Converter для выбора опции во время выполнения. С DataTemplateSelector вам нужно будет создать два DataTemplate по одному для каждого изображения и текста. Для конвертера вам придется переключать видимость на основе данных, которые поступают с сервера / базы данных.

Дайте мне знать для дальнейших запросов. Я могу помочь вам точно!

0 голосов
/ 24 апреля 2020

После некоторых исследований и испытаний я нашел подходящее для меня решение. Ответ Нихила правильный, но я бы сказал, что он неполный, особенно если он относится к части DataTemplateSelector.

Сначала я создал класс с именем EntryGroup, производный от List<Entry>. После этого я создал Свойство для привязки в моей ViewModel с именем Entries, которое было IEnumerable типа EntryGroup. Этот процесс описан здесь .

Я создал шаблон GroupHeader для отображения дат.

В моей ViewModel я получаю записи из своего репозитория и использую .GroupBy(it => it.Timestamp.Date) Linq метод. Это возвращает IGrouping<DateTime, Entry>. Поскольку он уже расширяет IEnumerable, половина работы выполнена. Я записал их в записи IEnumerable, используя foreach l oop.

Затем я создаю класс, производный от DataTemplateSelector, и создал ImageTemplate и TextTemplate, как указано здесь

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