public void OnPropertyChanged(string propertyName, object before, object after) { if (suppressPropertyChanged || !enabled) { return; } BeforePropertyChanged?.Invoke(this, new PropertyChangedExtendedEventArgs(propertyName, before, after)); if (!object.Equals(after, originalValues[propertyName])) { isChanged = true; changes[propertyName] = after; } else { isChanged = false; changes = new Dictionary <string, object>(); foreach (var prop in GetProperties()) { var v = prop.Get(trackable); if (!object.Equals(v, originalValues[prop.Name])) { isChanged = true; changes[prop.Name] = v; } } } AfterPropertyChanged?.Invoke(this, new PropertyChangedExtendedEventArgs(propertyName, before, after)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
public void OnPropertyChanged(string prop, object before, object after) { if (_isChangeDetectionPaused) { return; } if (prop != nameof(IsChanged)) { // auto-update the IsChanged property for standard properties #if DEBUG // System.Diagnostics.Debug.WriteLine($"Model change: {prop} from {before} to {after}"); #endif if (before != after) { IsChanged = true; } } // hook up to events DetachChangeEventHandlers(before); AttachChangeEventHandlers(after); // fire the event PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop)); // optional handler after property change completed (saving etc) AfterPropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop)); }