| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | using System;using System.ComponentModel;using System.Linq;using Comal.Classes;using InABox.Clients;using InABox.Core;namespace comal.timesheets{    public abstract class SingleDataModel<TEntity, TItem> : CoreDataModel<TEntity>, ISingleDataModel<TEntity, TItem>        where TEntity : Entity, IRemotable, IPersistent, new()         where TItem : SingleDataModelItem<TEntity>, new()    {        private TItem _item;        public TItem Item        {            get => _item;            set => SetProperty(ref _item, value);        }                public virtual void BeforeLoad(MultiQuery query, Guid id)        {        }        public virtual void AfterLoad(MultiQuery query, Guid id)        {        }        private TItem CreateItem(TEntity entity)        {            CoreTable table = new CoreTable();            table.LoadColumns(Columns);            CoreRow row = table.NewRow();            if (entity != null)                table.LoadRow(row, entity);            return new TItem() { Row = row, Parent = this };                      }                public void Load(TEntity entity, Action loaded = null)        {            MultiQuery query = new MultiQuery();                        BeforeLoad(query, entity.ID);            Item = CreateItem(entity);            Item.PropertyChanged += (sender, args) => DoPropertyChanged(sender, args);                        if (query.Count > 0)            {                query.Query(                    (q) =>                    {                        AfterLoad(q, entity.ID);                        loaded?.Invoke();                    });            }            else            {                AfterLoad(query, entity.ID);                loaded?.Invoke();            }        }                public void Load(Guid id, Action loaded = null)        {            MultiQuery query = new MultiQuery();                        query.Add(                new Filter<TEntity>(x=>x.ID).IsEqualTo(id),                Columns            );                        BeforeLoad(query, id);                        query.Query(                (q) =>                {                    var row = q.Get<TEntity>().Rows.FirstOrDefault();                    Item = (row != null)                        ? new TItem() { Row = row, Parent = this }                        : CreateItem(null);                    Item.PropertyChanged += (sender, args) => DoPropertyChanged(sender, args);                                        AfterLoad(q, id);                    loaded?.Invoke();                });        }        protected virtual void BeforeSave(TItem item)        {                    }                protected virtual void AfterSave(TItem item)        {                    }                public void Save(String auditmessage)        {            BeforeSave(Item);            new Client<TEntity>().Save(Item.Entity,auditmessage);            AfterSave(Item);        }            }}
 |