SingleDataModel.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System;
  2. using System.ComponentModel;
  3. using System.Linq;
  4. using Comal.Classes;
  5. using InABox.Clients;
  6. using InABox.Core;
  7. namespace comal.timesheets
  8. {
  9. public abstract class SingleDataModel<TEntity, TItem> : CoreDataModel<TEntity>, ISingleDataModel<TEntity, TItem>
  10. where TEntity : Entity, IRemotable, IPersistent, new()
  11. where TItem : SingleDataModelItem<TEntity>, new()
  12. {
  13. private TItem _item;
  14. public TItem Item
  15. {
  16. get => _item;
  17. set => SetProperty(ref _item, value);
  18. }
  19. public virtual void BeforeLoad(MultiQuery query, Guid id)
  20. {
  21. }
  22. public virtual void AfterLoad(MultiQuery query, Guid id)
  23. {
  24. }
  25. private TItem CreateItem(TEntity entity)
  26. {
  27. CoreTable table = new CoreTable();
  28. table.LoadColumns(Columns);
  29. CoreRow row = table.NewRow();
  30. if (entity != null)
  31. table.LoadRow(row, entity);
  32. return new TItem() { Row = row, Parent = this };
  33. }
  34. public void Load(TEntity entity, Action loaded = null)
  35. {
  36. MultiQuery query = new MultiQuery();
  37. BeforeLoad(query, entity.ID);
  38. Item = CreateItem(entity);
  39. Item.PropertyChanged += (sender, args) => DoPropertyChanged(sender, args);
  40. if (query.Count > 0)
  41. {
  42. query.Query(
  43. (q) =>
  44. {
  45. AfterLoad(q, entity.ID);
  46. loaded?.Invoke();
  47. });
  48. }
  49. else
  50. {
  51. AfterLoad(query, entity.ID);
  52. loaded?.Invoke();
  53. }
  54. }
  55. public void Load(Guid id, Action loaded = null)
  56. {
  57. MultiQuery query = new MultiQuery();
  58. query.Add(
  59. new Filter<TEntity>(x=>x.ID).IsEqualTo(id),
  60. Columns
  61. );
  62. BeforeLoad(query, id);
  63. query.Query(
  64. (q) =>
  65. {
  66. var row = q.Get<TEntity>().Rows.FirstOrDefault();
  67. Item = (row != null)
  68. ? new TItem() { Row = row, Parent = this }
  69. : CreateItem(null);
  70. Item.PropertyChanged += (sender, args) => DoPropertyChanged(sender, args);
  71. AfterLoad(q, id);
  72. loaded?.Invoke();
  73. });
  74. }
  75. protected virtual void BeforeSave(TItem item)
  76. {
  77. }
  78. protected virtual void AfterSave(TItem item)
  79. {
  80. }
  81. public void Save(String auditmessage)
  82. {
  83. BeforeSave(Item);
  84. new Client<TEntity>().Save(Item.Entity,auditmessage);
  85. AfterSave(Item);
  86. }
  87. }
  88. }