using System.Collections.Generic; using System.Linq; using Billing.Models; using Billing.UI; using Xamarin.Forms; namespace Billing.Views { public partial class AccountPage : BillingPage { private static readonly BindableProperty BalanceProperty = BindableProperty.Create(nameof(Balance), typeof(decimal), typeof(AccountPage)); private static readonly BindableProperty AssetProperty = BindableProperty.Create(nameof(Asset), typeof(decimal), typeof(AccountPage)); private static readonly BindableProperty LiabilityProperty = BindableProperty.Create(nameof(Liability), typeof(decimal), typeof(AccountPage)); private static readonly BindableProperty AccountsProperty = BindableProperty.Create(nameof(Accounts), typeof(List), typeof(AccountPage)); public decimal Balance => (decimal)GetValue(BalanceProperty); public decimal Asset => (decimal)GetValue(AssetProperty); public decimal Liability => (decimal)GetValue(LiabilityProperty); public List Accounts => (List)GetValue(AccountsProperty); public Command AddAccount { get; } private readonly List accounts; public AccountPage() { AddAccount = new Command(OnAddAccount); accounts = new List(); SetValue(AccountsProperty, accounts); InitializeComponent(); } private async void OnAddAccount() { if (Tap.IsBusy) { return; } using (Tap.Start()) { var page = new AddAccountPage(); page.AccountChecked += AccountChecked; await Navigation.PushAsync(page); } } private void AccountChecked(object sender, AccountEventArgs e) { Helper.Debug(e.Account.ToString()); var group = accounts.FirstOrDefault(g => g.Key == e.Account.Category); if (group == null) { group = new AccountGrouping(e.Account.Category) { e.Account }; accounts.Add(group); } else { group.Add(e.Account); } groupLayout.Refresh(accounts); } } public class AccountGrouping : List, IGrouping { public AccountGrouping(AccountCategory key) : base() => Key = key; public AccountCategory Key { get; } public decimal Balance { get; set; } } }