Как сгруппировать список данных из настроек в Xamarin

У меня есть списки информации о заказе, хранящиеся в настройках, следующим образом:

public class CartUser
{       
    public int IDProduct { get; set; }
    public string NameProduct { get; set; } 
    public string SupplierID { get; set; }
}

Я хочу отобразить список групп SupplierID, я думаю о плане использования Group By

PageOne.xaml.cs

List<CartUser> cartUsers = new List<CartUser>();
var mycart = Preferences.Get("CartUserAdds", "_mycart");
var getcart = JsonConvert.DeserializeObject<List<CartUser>>(mycart).GroupBy(x => x.SupplierID);
cartUsers = (List<CartUser>)getcart;
BindableLayout.SetItemsSource(stdata, cartUsers);

Однако я получаю сообщение об ошибке: System.InvalidCastException: 'Specified cast is not valid.' правая строка cartUsers = (List<CartUser>)getcart;

PageOne.xaml

<StackLayout x:Name = "stdata">
    <BindableLayout.ItemTemplate>
        <DataTemplate>
            <StackLayout x:DataType = "model:CartUser">
                <Label Text = "{Binding SupplierID}"/>
                <Label Text = "{Binding NameProduct}"/>
            </StackLayout>
        </DataTemplate>
    </BindableLayout.ItemTemplate>                            
</StackLayout>

Данные, которые я беру из настроек:

[{\"IDProduct\":1,\"NameProduct\":\"Name product 1\",\"SupplierID\":\"22379356\"},{\"IDProduct\":2,\"NameProduct\":\"Name product 2\",\"SupplierID\":\"22379356\"},{\"IDProduct\":3,\"NameProduct\":\"Name product 3\",\"SupplierID\":\"12336544\"}]

Я хочу, чтобы это отображалось так

Как сгруппировать список данных из настроек в Xamarin

Я прочитал эту статью: Как сгруппировать список в формах Xamarin?. Однако он устанавливает отображение в ListView. Я хочу, чтобы он отображался в StackLayout

Ждем решения от всех. Благодарю вас!

Обновление с помощью CollectionView

SupplierIDGrouping.cs

public class SupplierIDGrouping : ObservableCollection<CartUser>
{
    public string SupplierID { get; private set; }

    public SupplierIDGrouping(string supplierID)
    : base()
    {
        SupplierID = supplierID;
    }

    public SupplierIDGrouping(string supplierID, IEnumerable<CartUser> source)
        : base(source)
    {
        SupplierID = supplierID;
    }

}

PageOne.xaml

<CollectionView ItemsSource = "{Binding SupplierList}" IsGrouped = "true">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Label Text = "{Binding NameProduct}"/>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

PageOne.xaml.cs

public ObservableCollection<SupplierIDGrouping> SupplierList { get; private set; } = new ObservableCollection<SupplierIDGrouping>();

List<CartUser> cartUsers = new List<CartUser>();
var mycart = Preferences.Get("CartUserAdds", "_mycart");
var getcart = JsonConvert.DeserializeObject<List<CartUser>>(mycart);
cartUsers = getcart;

foreach (var item in cartUsers)
{
    if (!SupplierList.Any(supplierid => supplierid.SupplierID == item.SupplierID))
    {
        SupplierList.Add(new SupplierIDGrouping(item.SupplierID));
    }

    SupplierList.Single(supplierid => supplierid.SupplierID== item.SupplierID).Add(item);
}

BindingContext = this;

В результате его по-прежнему нельзя сгруппировать.

Как сгруппировать список данных из настроек в Xamarin


39
1

Ответ:

Решено

Нам нужно установить шаблон для заголовка группы, попробуйте код ниже.

 <CollectionView ItemsSource = "{Binding SupplierList}"  IsGrouped = "true">
        <CollectionView.GroupHeaderTemplate>
            <DataTemplate>
                <Label Text = "{Binding SupplierID}" FontAttributes = "Bold"/>
            </DataTemplate>
        </CollectionView.GroupHeaderTemplate>
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Label Text = "{Binding NameProduct}"/>
            </DataTemplate>
        </CollectionView.ItemTemplate>
</CollectionView>