У меня есть списки информации о заказе, хранящиеся в настройках, следующим образом:
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?. Однако он устанавливает отображение в 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;
В результате его по-прежнему нельзя сгруппировать.
Нам нужно установить шаблон для заголовка группы, попробуйте код ниже.
<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>