C# 如何对Xamarin表单中的列表进行分组?
我需要在xamarin表单中将下面的列表分组,并在ListView中显示公司名称。我已经研究过,通过可观测的收集,这是可能的。但我不知道怎么做。谁能帮我实现这个目标 列表C# 如何对Xamarin表单中的列表进行分组?,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我需要在xamarin表单中将下面的列表分组,并在ListView中显示公司名称。我已经研究过,通过可观测的收集,这是可能的。但我不知道怎么做。谁能帮我实现这个目标 列表 public class Phone { public string Title { get; set; } public string Company { get; set; } public int Price { get; set; } } var phones = new List<P
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 }
};
您可以尝试以下代码段
var list= phones.GroupBy(item => item.Company)
.Select(group => new { Company= group.Key, Items = group.ToList() })
.ToList();
请尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
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 }
};
var groups = phones.GroupBy(x => x.Company);
foreach (var group in groups)
{
Console.WriteLine(group.Key);
foreach (Phone phone in group)
{
Console.WriteLine("Title : {0}", phone.Title);
Console.WriteLine("Price : {0}", phone.Price);
Console.WriteLine();
}
}
Console.ReadLine();
}
}
public class Phone
{
public string Title { get; set; }
public string Company { get; set; }
public int Price { get; set; }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
var=新列表{
新手机{Title=“Galaxy S8”,Company=“Samsung”,价格=60000},
新手机{Title=“Galaxy S7 Edge”,Company=“Samsung”,价格=50000},
新手机{Title=“华为P10”,Company=“华为”,价格=10000},
新手机{Title=“Huawe Mate 8”,Company=“华为”,价格=29000},
新手机{Title=“iphone7”,Company=“Apple”,Price=38000},
新手机{Title=“iphone6s”,Company=“Apple”,价格=50000}
};
var groups=phones.GroupBy(x=>x.Company);
foreach(组中的var组)
{
控制台写入线(组键);
foreach(组中的电话)
{
Console.WriteLine(“Title:{0}”,phone.Title);
Console.WriteLine(“Price:{0}”,phone.Price);
Console.WriteLine();
}
}
Console.ReadLine();
}
}
公用电话
{
公共字符串标题{get;set;}
公共字符串公司{get;set;}
公共整数价格{get;set;}
}
}
您需要创建一个模型,该模型包含一个分组,其中一个键将用作标题(以及分组依据的值)和实际模型
我在上面创建了如下内容:
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;
}
}
现在将ListView
添加到您的页面,我已经在XAML中完成了,并将ItemsSource
配置到您定义的集合中。要启用分组,还可以像下面的代码中那样设置IsGroupingEnabled
和GroupDisplayBinding
属性
<ListView ItemsSource="{Binding PhonesList}" IsGroupingEnabled="True" GroupDisplayBinding="{Binding Name}">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Title}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
GetData
是用JSON检索数据的调用,我们清除列表以替换所有内容,然后循环检查组(本例中的公司)是否已经存在。如果没有,我们将创建组并添加当前电话
这不是最有效的方法,但我认为目前最清楚的解释方法。希望这有助于创建JSON并从中加载,控制台?这是一个Xamarin.Forms应用程序!此代码将列表分组。但是如何在Xamarin表单中的Listview中分配这些内容呢?@Ganeshgm7看看这篇文章当我为不同的组添加了数据时,上面的代码是有效的。但在我的例子中,我将获得JSON格式的数据,比如Title=“Galaxy S8”,Company=“Samsung”,Price=60000,我需要根据运行时已知的公司进行分组。我得到了列表中的数据。但我不知道如何处理收藏。有什么想法吗?
PhonesList.Add(new PhoneGroup("Apple", new[]{ new Phone
{
Title = "iPhone 6s",
Price = 50000
},
new Phone
{
Title = "iPhone 7",
Price = 38000
}}));
<ListView ItemsSource="{Binding PhonesList}" IsGroupingEnabled="True" GroupDisplayBinding="{Binding Name}">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Title}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
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);
}