如何在 Xamarin Forms 中对列表进行分组?

2024-05-05

我需要将下面的列表以 xamarin 形式与公司名称进行分组并需要在 ListView 中显示。我研究过 ObservableCollection 是可能的。但我不知道该怎么做。任何人都可以帮助实现这一目标吗?

List

public class Phone
{
    public string Title { get; set; }
    public string Company { get; set; }
    public int Price { get; set; }
} 

var phones = new List<Phone>
            {
                new Phone {Title="Galaxy S8", Company="Samsung", Price=60000 },
                new Phone {Title="Galaxy S7 Edge", Company="Samsung", Price=50000 },
                new Phone {Title="Huawei P10", Company="Huawei", Price=10000 },
                new Phone {Title="Huawe Mate 8", Company="Huawei", Price=29000 },
                new Phone {Title="iPhone 7", Company="Apple", Price=38000 },
                new Phone {Title="iPhone 6S", Company="Apple", Price=50000 }
            };

预期产出(在 Xamarin Forms Android、iOS 和 UWP 中)

Apple
Title : iPhone 6S
Price : 50000

Title : iPhone 7
Price : 38000

Huawei
Title : Huawei P10
Price : 10000

Title : Huawe Mate 8
Price : 29000

Samsung
Title : Galaxy S8
Price : 60000

Title : Galaxy S7 Edge
Price : 50000

您将需要创建一个模型,其中包含一个分组,其中的键将用作标题(以及分组所依据的值)和实际模型。

我是这样创建的:

public class PhoneGroup : ObservableCollection<Phone>
{
    public string Name { get; private set; }

    public PhoneGroup(string name)
        : base()
    {
        Name = name;
    }

    public PhoneGroup(string name, IEnumerable<Phone> source)
        : base(source)
    {
        Name = name;
    }
}

这继承自ObservableCollection并添加一个Name可以用作键的属性。

现在,在您的页面(或更好;vie 模型)中,您可以添加如下集合:

public ObservableCollection<PhoneGroup> PhonesList { get; set; } = new ObservableCollection<PhoneGroup>();

要向其中添加项目,您首先必须创建该组,或者检查它是否存在并将项目添加到正确的组,即:

PhonesList.Add(new PhoneGroup("Apple", new[]{ new Phone
            {
                Title = "iPhone 6s",
                Price = 50000
            },
            new Phone
            {
                Title = "iPhone 7",
                Price = 38000
            }}));

现在添加一个ListView到你的页面,我已经在 XAML 中完成了,并配置ItemsSource到您定义的集合。要启用分组,还需设置IsGroupingEnabled and GroupDisplayBinding属性如下面的代码所示。

<ListView ItemsSource="{Binding PhonesList}" IsGroupingEnabled="True" GroupDisplayBinding="{Binding Name}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextCell Text="{Binding Title}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

输出将如下所示:

我已经为您创建了一个示例项目,您可以找到它here https://github.com/jfversluis/GroupingListViewSample以及伴随的博客文章 https://blog.verslu.is/xamarin/xamarin-forms-xamarin/implement-grouping-xamarin-forms-listview/.

根据您加载数据的方式,您可以实现 LINQ 查询,以正确的方式将模型排序到分组列表中。

当然,其他方法也是可能的。值得注意的是,看看 James Montemagno 的 MVVM Helpers 库here https://github.com/jamesmontemagno/mvvm-helpers. The ObservableRangeCollection比常规的有一些方便的扩展ObservableCollection并且它还拥有一个Grouping模型,这是一种更通用的分组方法。

根据您的评论,要检索数据并将其添加到组中,您可以按照以下方式思考:

var phonesResult = GetData();

PhonesList.Clear();
foreach (var phone in phonesResult)
{
    if (!PhonesList.Any(company => company.Name == phone.Company))
        PhonesList.Add(new PhoneGroup(phone.Company));

    PhonesList.Single(company => company.Name == phone.Company).Add(phone);
}

GetData是检索 JSON 数据的调用,我们清除列表以替换所有内容,然后循环遍历它并检查该组(在本例中为公司)是否已存在。如果没有,我们将创建组并添加当前电话。

这不是最有效的方法,但我认为目前是向您解释的最清楚的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Xamarin Forms 中对列表进行分组? 的相关文章

随机推荐

  • 如何在点击 Qtablewidget 单元格时获取放置在该单元格中的小部件的行号?

    我正在尝试的是当用户选择项目时获取 QcomboBox 的行号 虽然使用它很容易获得单元格的列和行 cellClicked int int 信号 但仅当单元格上没有小部件时才有效 那么如果单元格中放置了小部件 如何获取行号 Note 所有组
  • SVG 视图框显示屏幕外项目

    我正在使用 HTML5 制作游戏svg标签为图形提供多分辨率显示 游戏的大部分内容已经完成 但在测试中我刚刚遇到了一个主要错误 其中涉及 SVG 对象可见 尽管在非本机分辨率下位于视图框之外 我不确定这是否是我的代码或浏览器本身的缺陷 Go
  • 从 WPF 打印/报告的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在单击片段的按钮时替换该片段?

    我有一个包含多个片段的活动 Activity 最初有片段 其中有两个按钮 单击此按钮后 我必须用新片段替换该片段 每个片段都有各种小部件 并将当前片段替换为各种事件 这是我的问题 我怎样才能实现这个目标 给我建议 您可以用 Fragment
  • 从现有 MongoDB 创建可视化的工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我接手了一个现有 MongoDB 的项目 我想获得现有数据的视觉图像 图表等 显然 MongoDB 与
  • Android USB_DEVICE_ATTACHED 持久权限

    如何让 Android 在每次重新连接 USB 设备时都不再请求权限 我想让它记住 USB 设备的 默认使用 复选标记 这样我就不必每次都向同一设备授予权限 我以编程方式检测 USB 设备 Android 手机 何时连接到我的主机设备 An
  • 如何找到一组值的精确匹配?

    我有一个简单的表来存储师生关系 以显示学生正在上谁的课或老师正在教谁 无论哪种方式 为便于阅读 按老师排序 CREATE TABLE TS RELATIONSHIP Teacher NVARCHAR 10 Student NVARCHAR
  • 求反射角的弧度

    我正在编写一个简单的 Flash 游戏 只是为了学习 Flash 并提高我的数学能力 但我对弧度感到非常困惑 因为这对我来说是新的 到目前为止 我所做的是使用鼠标 单击并释放 使用弧度向该方向射出一个球 现在我想要发生的是 当球撞到墙壁时
  • Node exec 无权执行脚本

    直到最近 它都运行良好 但是当我今天尝试使用它时 它无法正常运行 它返回以下错误 错误 命令失败 bin sh c home pi RPi Computer Power RPi Server routes scripts hash js 1
  • Cordova 3.0,应用程序错误与服务器的连接失败。 (暂停)

    我在尝试加载本地 index html 文件时遇到超时问题 但我不知道如何增加默认的 20 秒超时时间 我见过人们在 droidgap 扩展 onCreate 方法中使用以下几行的帖子 super setIntegerProperty lo
  • 在 Angular 中使用异步管道设置选择元素的选定项目

    角度专家 我试图理解 Angular 中的异步管道 但我陷入了一个基本场景 我在用户界面中有两个选择元素 一个包含帖子 一个包含相关评论 我想将一个帖子 最后一个 设置为显示帖子的选择元素的最初选择的帖子 并且我想使用所选项目来过滤第二个选
  • cmake 找不到 boost 库,因为它查找错误的文件名

    我根据文档在 Windows 8 1 机器上构建了 boost 1 56 库 作为共享库和静态库 他们全部出现在BOOST ROOT stage lib目录 文件名格式如下 boost thread vc120 mt 1 56 dll bo
  • 在 GAE/J 上创建文件并上传到 Google 文档

    是否可以在 GAE J 上创建任何类型的文件并上传到 google 文档 我问过一个类似的问题 https stackoverflow com questions 3996495 uploading a pdf file to google
  • 可与 switch() 一起使用的自定义结构/类型

    我的一个项目有一个值类型 结构 表示视频格式的自定义标识符字符串 在本例中 它将包含内容类型字符串 但这可能会有所不同 我使用了一个结构体 因此它在传递时可以是强类型的 并对初始字符串值执行一些健全性检查 实际的字符串值可以是任何内容并由外
  • 在ReactJS中,如果我们不为useEffect提供依赖数组,是否会导致该函数每次都被调用?

    我看到在ReactJS 文档 https reactjs org docs hooks overview html的依赖数组useEffect fn 是可选的 不提供它应该与提供空数组相同 但是 如果我的代码如下 https codesan
  • boost::serialization 序列化期间内存消耗较高

    正如主题所示 在将大量数据序列化到文件时 我遇到了 boost serialization 的一个小问题 问题在于应用程序序列化部分的内存占用量大约是要序列化的对象内存的 3 到 3 5 倍 值得注意的是 我拥有的数据结构是基类指针和指向该
  • 新的 Angular 项目不包含 e2e 文件夹

    我的系统上已经安装了 Angular 并且大约 7 8 个月前曾短暂使用过它 不久前 我创建了一个新的 Angular 项目 ng new testproject 奇怪的是 e2e 文件夹没有创建 我尝试卸载 CLI 清除缓存并重新安装 A
  • 使用抽象类型的反射从表中获取实体

    好的 我有一个名为 Product 的抽象类 我有 3 个表 分别称为 Items Kits 和 Packages 它们实现了 Product 产品具有公开对象主键的公共属性 也就是说 我有一个传递产品的表格 我想将该产品从新的数据上下文中
  • 读取输入文件的部分内容

    我想读取 C 中的输入文件 其结构 或缺乏 将类似于一系列带有以下内容的行 文字 数字 例如 input1 10 input2 4 set1 1 2 set2 1 e3 我想把这个号码从队列中取出 然后把剩下的扔掉 数字可以是整数或双精度数
  • 如何在 Xamarin Forms 中对列表进行分组?

    我需要将下面的列表以 xamarin 形式与公司名称进行分组并需要在 ListView 中显示 我研究过 ObservableCollection 是可能的 但我不知道该怎么做 任何人都可以帮助实现这一目标吗 List public cla