Exemplo n.º 1
0
 public void PauseDirtyTracking()
 {
     if (DirtyTracking != eDirtyTracking.NotStarted)
     {
         DirtyTracking    = eDirtyTracking.Paused;
         PropertyChanged -= ItmePropertyChanged;
     }
 }
Exemplo n.º 2
0
        public void ResumeDirtyTracking()
        {
            if (DirtyTracking == eDirtyTracking.NotStarted)
            {
                StartDirtyTracking();
                return;
            }

            if (DirtyTracking == eDirtyTracking.Paused)
            {
                DirtyTracking    = eDirtyTracking.Started;
                PropertyChanged += ItmePropertyChanged;
            }
        }
Exemplo n.º 3
0
        public void StartDirtyTracking()
        {
            if (DirtyStatus != eDirtyStatus.NoTracked && DirtyTracking != eDirtyTracking.NotStarted)
            {
                // Nothing to do
                return;
            }

            DirtyTrackingFields = new ConcurrentBag <string>();
            DirtyStatus         = eDirtyStatus.NoChange;
            //first track self item changes
            if (PropertyChanged == null)
            {
                PropertyChanged += ItmePropertyChanged;
            }
            //set dirty tracking to started
            DirtyTracking = eDirtyTracking.Started;

            // now track all children which are marked with isSerizalized...
            // throw err if item is serialized but dindn't impl IsDirty

            // Properties
            Parallel.ForEach(this.GetType().GetProperties(), PI =>
            {
                var token = PI.GetCustomAttribute(typeof(IsSerializedForLocalRepositoryAttribute));
                if (token == null)
                {
                    return;
                }

                DirtyTrackingFields.Add(PI.Name);

                // We track observable list which are seriazlized - drill down recursivley in obj tree
                if (typeof(IObservableList).IsAssignableFrom(PI.PropertyType))
                {
                    //skip list if it is LazyLoad and was not loaded yet
                    var lazyLoadtoken = PI.GetCustomAttribute(typeof(IsLazyLoadAttribute));
                    if (lazyLoadtoken != null)
                    {
                        string lazyStatusProp = PI.Name + nameof(IObservableList.LazyLoad);
                        if (this.GetType().GetProperty(lazyStatusProp) != null)
                        {
                            if (bool.Parse(this.GetType().GetProperty(PI.Name + nameof(IObservableList.LazyLoad)).GetValue(this).ToString()) == true)
                            {
                                return;//skip doing dirty tracking for observableList which is LazyLoad and not loaded yet
                            }
                        }
                        else
                        {
                            Reporter.ToLog(eLogLevel.ERROR, string.Format("Failed to check if to start DirtyTracking for Lazy Load ObservabelList called '{0}' because the property '{1}' is missing", PI.Name, lazyStatusProp));
                        }
                    }

                    IObservableList obj = (IObservableList)PI.GetValue(this);
                    if (obj == null)
                    {
                        return;
                    }
                    TrackObservableList((IObservableList)obj);
                }
            });

            // Fields
            Parallel.ForEach(this.GetType().GetFields(), FI =>
            {
                var token = FI.GetCustomAttribute(typeof(IsSerializedForLocalRepositoryAttribute));
                if (token == null)
                {
                    return;
                }

                DirtyTrackingFields.Add(FI.Name);

                // We track observable list which are seriazlized - drill down recursivley in obj tree
                if (typeof(IObservableList).IsAssignableFrom(FI.FieldType))
                {
                    IObservableList obj = (IObservableList)FI.GetValue(this);
                    if (obj == null)
                    {
                        return;
                    }
                    TrackObservableList((IObservableList)obj);
                }
            });
        }