C# 在集合视图中分组和显示不同类型的项-Xamarin表单

C# 在集合视图中分组和显示不同类型的项-Xamarin表单,c#,xaml,xamarin.forms,C#,Xaml,Xamarin.forms,我试图获得一个日志类型的gui,其中条目按日期排序。 我想从数据库中取出日记账条目,对当天添加的条目进行分组,并用标签将这些分组分开。 有点像facebook messenger聊天记录 这就是我所想的: <ScrollView> <CollectionView ItemsSource="{Binding JournalEntries}" SelectionMode="None"> <CollectionView.It

我试图获得一个日志类型的gui,其中条目按日期排序。 我想从数据库中取出日记账条目,对当天添加的条目进行分组,并用标签将这些分组分开。 有点像facebook messenger聊天记录

这就是我所想的:

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

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

日期
问题是“JournalEntry”对象可以有多种类型。 例如,“Photo”源自“JournalEntry”。因此,如果“JournalEntries”集合中有“Photo”对象,我希望显示图像,而不是“ToString()”文本

  • 将日志分为不同日期的最佳方式是什么,这样我可以在组上显示标签?

  • 我如何在运行时决定对象应显示为图像还是文本?

  • 任何帮助都将不胜感激。

    以下是答案:-

  • 您可以使用
    JournalEntries.GroupBy(x=>x.date).ToDictionary()
    。为此,您必须使用System.Ling。这将返回一个字典,其键将是日期和值中列表形式的所有条目。这将更易于您使用

  • 您可以使用DataTemplateSelector或Converter在运行时选择选项。使用DataTemplateSelector,您必须为每个图像和文本创建两个DataTemplates。对于Converter,您必须根据来自服务器/数据库的数据切换可见性


  • 让我知道进一步的疑问。我一定能帮你

    经过一些研究和测试,我找到了适合我的解决方案。Nikhil的回答是正确的,但我要说是不完整的,特别是因为它涉及DataTemplateSelector部分

    首先,我创建了一个名为
    EntryGroup
    的类,它源自
    List
    。 在此之后,我在ViewModel中创建了一个名为
    Entries
    的绑定属性,它是
    EntryGroup
    类型的
    IEnumerable
    。 概述了这一过程

    我创建了一个GroupHeaderTemplate来显示日期

    在我的ViewModel中,我从存储库中获取条目,并使用
    .GroupBy(it=>it.Timestamp.Date)
    Linq方法。这将返回一个
    i分组
    。 因为它已经扩展了IEnumerable,所以完成了一半的工作。 我使用foreach循环将它们写入条目IEnumerable


    然后,我创建了一个派生自
    DataTemplateSelector
    的类,并创建了一个
    ImageTemplate
    和一个
    textmplate
    ,如下所述

    谢谢您的回答!关于第1点我仍然不确定如何确保每天只打印一次日期。对于您的解决方案,我仍然需要在另一个CollectionView中使用CollectionView,对吗?您可以在CollectionView中使用分组。嵌套的CollectionView不是一个好的做法。链接供您参考。这正是我要找的!非常感谢!