ListDataModel.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using InABox.Core;
  5. namespace comal.timesheets
  6. {
  7. public abstract class ListDataModel<TEntity, TItem> : CoreDataModel<TEntity>, IListDataModel<TEntity, TItem>
  8. where TEntity : Entity, IRemotable, IPersistent, new()
  9. where TItem : CoreDataModelItem, new()
  10. {
  11. public SortOrder<TEntity> Sort => LookupFactory.DefineSort<TEntity>();
  12. private IEnumerable<TItem> _allitems;
  13. private IList<TItem> _items = new List<TItem>();
  14. public IList<TItem> Items
  15. {
  16. get => _items;
  17. set => SetProperty(ref _items, value);
  18. }
  19. public void Search(Func<TItem, bool> predicate)
  20. {
  21. Items = predicate != null
  22. ? new List<TItem>(_allitems.Where(predicate))
  23. : new List<TItem>(_allitems);
  24. }
  25. public virtual void BeforeLoad(MultiQuery query, Filter<TEntity> filter)
  26. {
  27. }
  28. public virtual void AfterLoad(MultiQuery query, Filter<TEntity> filter)
  29. {
  30. }
  31. public void Load(Filter<TEntity> filter, Action loaded = null)
  32. {
  33. MultiQuery query = new MultiQuery();
  34. query.Add(
  35. filter,
  36. Columns,
  37. Sort
  38. );
  39. BeforeLoad(query, filter);
  40. query.Query(
  41. (q) =>
  42. {
  43. _allitems = new List<TItem>(q.Get<TEntity>().Rows.Select(row => new TItem() { Row = row, Parent = this }));
  44. Search(null);
  45. AfterLoad(q, filter);
  46. loaded?.Invoke();
  47. });
  48. }
  49. }
  50. }