public void PauseDirtyTracking() { if (DirtyTracking != eDirtyTracking.NotStarted) { DirtyTracking = eDirtyTracking.Paused; PropertyChanged -= ItmePropertyChanged; } }
public void ResumeDirtyTracking() { if (DirtyTracking == eDirtyTracking.NotStarted) { StartDirtyTracking(); return; } if (DirtyTracking == eDirtyTracking.Paused) { DirtyTracking = eDirtyTracking.Started; PropertyChanged += ItmePropertyChanged; } }
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); } }); }