using System; using System.Collections.Generic; using System.Linq; using InABox.Core; namespace comal.timesheets { public abstract class ListDataModel : CoreDataModel, IListDataModel where TEntity : Entity, IRemotable, IPersistent, new() where TItem : CoreDataModelItem, new() { public SortOrder Sort => LookupFactory.DefineSort(); private IEnumerable _allitems; protected IList _items = new List(); public IList Items { get => _items; set => SetProperty(ref _items, value); } public void Search(Func predicate) { Items = predicate != null ? new List(_allitems.Where(predicate)) : new List(_allitems); } public virtual void BeforeLoad(MultiQuery query, Filter filter) { } public virtual void AfterLoad(MultiQuery query, Filter filter) { } public void Load(Filter filter, Action loaded = null) { MultiQuery query = new MultiQuery(); query.Add( filter, Columns, Sort ); BeforeLoad(query, filter); query.Query( (q) => { _allitems = new List(q.Get().Rows.Select(row => CreateItem(row))); Search(null); AfterLoad(q, filter); loaded?.Invoke(); }); } protected T CreateItem(CoreRow row) where T : CoreDataModelItem, new() { var result = new T() { Row = row, Parent = this }; result.PropertyChanged += (sender, args) => DoPropertyChanged(result, args); return result; } } }