您将需要创建一个模型,其中包含一个分组,其中的键将用作标题(以及分组所依据的值)和实际模型。
我是这样创建的:
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 数据的调用,我们清除列表以替换所有内容,然后循环遍历它并检查该组(在本例中为公司)是否已存在。如果没有,我们将创建组并添加当前电话。
这不是最有效的方法,但我认为目前是向您解释的最清楚的方法。