C# 将分组ListView与不同的模型和数据模板一起使用

C# 将分组ListView与不同的模型和数据模板一起使用,c#,listview,xamarin,xamarin.forms,C#,Listview,Xamarin,Xamarin.forms,我希望这种类型的ListView具有不同的ViewCell类型、不同的数据、不同的标题文本(带有自定义标题单元格),但都是一个ListView: ********************** * General info ********************** | Category: Cabrio | Type: Sportscar ********************** * Available models ********************** | Year: 2007 |

我希望这种类型的
ListView
具有不同的
ViewCell
类型、不同的数据、不同的标题文本(带有自定义标题单元格),但都是一个
ListView

**********************
* General info
**********************
| Category: Cabrio
| Type: Sportscar
**********************
* Available models
**********************
| Year: 2007
| Manufacturer: Chevrolet
| Model: Corvette
----------------------
| Year: 2009
| Manufacturer: Dodge
| Model: Charger
----------------------
因此,我使用这个
分组
对象来保存节(标题)标题和列表:

分组。cs:

公共类分组:ObservableCollection
{
公钥{get;private set;}
公共分组(K键,IEnumerable项)
{
钥匙=钥匙;
foreach(项目中的var项目)
此.Items.Add(item);
}
}
摘自

如何在我的
列表视图中使用不同的数据?目前,我的数据库中有此非编译代码

MainPage.xaml.cs:

public分部类主页面:ContentPage
{
私有可观察收集项目分组;
公共主页()
{
初始化组件();
this.itemsGrouped=新的ObservableCollection();
列表类别=新列表();
类别。增加(新类别(“Cabrio”、“跑车”);
this.itemsGrouped.Add(新分组(“常规信息”,类别));
列出车辆=新列表();
新增(新卡林福(“2007”、“雪佛兰”、“克尔维特”);
添加(新CarInfo(“2009”、“道奇”、“充电器”);
添加(新分组(“可用模型”,汽车));
this.mainList.BindingContext=this.itemsGroup;
}
}
参数1:无法从“TestGroupedListView.Model.Grouping”转换为“TestGroupedListView.Model.Grouping”

一般的想法是使用
DataTemplateSelector
能够使用不同类型的单元格,并使用
分组
具有不同的自定义标题

以下是我的完整示例项目代码:

Category.cs:

公共类类别
{
公共字符串CategoryName{get;set;}
公共字符串TypeOfCar{get;set;}
公共类别(字符串categoryName、字符串typeOfCar)
{
this.CategoryName=CategoryName;
this.TypeOfCar=TypeOfCar;
}
}
CarInfo.cs:

公共类CarInfo
{
公共字符串年份{get;set;}
公共字符串制造商{get;set;}
公共字符串名称{get;set;}
public CarInfo(字符串年份、字符串制造商、字符串名称)
{
今年=年;
这个。制造商=制造商;
this.Name=Name;
}
}
GeneralView.xaml:


GeneralView.xaml.cs:

[XamlCompilation(XamlCompilationOptions.Compile)]
公共部分类GeneralView:ViewCell
{
私有列表数据列表;
公共总视图()
{
初始化组件();
}
受保护的覆盖无效OnBindingContextChanged()
{
base.OnBindingContextChanged();
var generalInfo=BindingContext作为类别;
如果(通用信息!=null)
{
此.SetupView(generalInfo);
}
}
专用无效设置视图(类别项目)
{
this.dataList=新列表();
this.dataList.Add(新的KeyValuePair(“Name”,item.CategoryName));
添加(新的KeyValuePair(“Type”,item.TypeOfCar));
this.mainGrid.ColumnDefinitions.Add(newcolumnDefinition{Width=newgridLength(1,GridUnitType.Star)});
this.mainGrid.ColumnDefinitions.Add(newcolumnDefinition{Width=newgridLength(1,GridUnitType.Star)});
for(int i=0;i
InfoItemView.xaml:


InfoItemView.xaml.cs:

[XamlCompilation(XamlCompilationOptions.Compile)]
公共部分类InfoItemView:ViewCell
{
私有列表数据列表;
公共信息项视图()
{
初始化组件();
}
受保护的覆盖无效OnBindingContextChanged()
{
base.OnBindingContextChanged();
var info=BindingContext作为CarInfo;
如果(信息!=null)
{
此.SetupView(信息);
}
}
专用void设置视图(CarInfo项目)
{
this.dataList=新列表();
这个.dataList.Add(新的KeyValuePair(“年”,item.Year));
此.dataList.Add(新的KeyValuePair(“制造商”,item.Manufacturer));
this.dataList.Add(新的KeyValuePair(“Name”,item.Name));
this.mainGrid.ColumnDefinitions.Add(newcolumnDefinition{Width=newgridLength(1,GridUnitType.Star)});
this.mainGrid.ColumnDefinitions.Add(newcolumnDefinition{Width=newgridLength(1,GridUnitType.Star)});
for(int i=0;i
在我的实际项目中,这两种单元格类型的差异更大,但你应该了解其中的含义

ListViewGroupHeader.cs:

公共类ListViewGroupHeader:标签
{
}
MyDataTemplateSelector.cs:

公共类MyDataTemplateSelector:DataTemplateSelector
{
公共数据模板购物车